protected override void SetDataInternal <T>(T[] data, BufferDataUsage usage)
        {
            // ohhh yeahh
            int size = data.Length * Marshal.SizeOf(typeof(T));

            GCHandle ptr = GCHandle.Alloc(data, GCHandleType.Pinned);

            try
            {
                Internal.OpenGL.Methods.glBufferData(OpenGLEngine.BufferTargetToGLBufferTarget(_target), size, ptr.AddrOfPinnedObject(), OpenGLEngine.BufferDataUsageToGLBufferDataUsage(usage));
            }
            finally
            {
                ptr.Free();
            }
            Internal.OpenGL.Methods.glErrorToException();
        }
        internal static Constants.GLBufferDataUsage BufferDataUsageToGLBufferDataUsage(BufferDataUsage usage)
        {
            switch (usage)
            {
            case BufferDataUsage.DynamicCopy: return(Constants.GLBufferDataUsage.DynamicCopy);

            case BufferDataUsage.DynamicDraw: return(Constants.GLBufferDataUsage.DynamicDraw);

            case BufferDataUsage.DynamicRead: return(Constants.GLBufferDataUsage.DynamicRead);

            case BufferDataUsage.StaticCopy: return(Constants.GLBufferDataUsage.StaticCopy);

            case BufferDataUsage.StaticDraw: return(Constants.GLBufferDataUsage.StaticDraw);

            case BufferDataUsage.StaticRead: return(Constants.GLBufferDataUsage.StaticRead);

            case BufferDataUsage.StreamCopy: return(Constants.GLBufferDataUsage.StreamCopy);

            case BufferDataUsage.StreamDraw: return(Constants.GLBufferDataUsage.StreamDraw);

            case BufferDataUsage.StreamRead: return(Constants.GLBufferDataUsage.StreamRead);
            }
            throw new InvalidEnumerationException();
        }
 public void SetData <T>(T[] data, BufferDataUsage usage)
 {
     SetDataInternal <T>(data, usage);
 }
 protected abstract void SetDataInternal <T>(T[] data, BufferDataUsage usage);