public static void BufferData(BufferTarget target, int size, ref object dataArray, BufferUsage usage) { GCHandle hData = GCHandle.Alloc(dataArray, GCHandleType.Pinned); try { Delegates.BufferDataARB_IP(target, size, hData.AddrOfPinnedObject(), usage); } finally { hData.Free(); } }
/* * /// <summary> * /// Creates a buffer data storage and copies data into it * /// </summary> * /// <param name="target"></param> * /// <param name="size"></param> * /// <param name="ptr"></param> * /// <param name="usage"></param> * public static void BufferData(BufferTarget target, int size, IntPtr ptr, BufferUsage usage) { * Delegates.BufferDataARB_IP(target, size, ptr, usage); * } * * public static void BufferSubData(BufferTarget target, int offset, int size, IntPtr ptr) { * Delegates.BufferSubDataARB_IP(target, offset, size, ptr); * } */ public static void BufferData <TArray>(BufferTarget target, int size, ref TArray[] data, BufferUsage usage) where TArray : struct { // TODO: if possible, find a way to do it without a garbage collector handle creation ... // commented code now generates error "Cannot implicitly convert type 'System.Array' to 'void*' (CS0029)" // unsafe { fixed (void *ptr = data) { Delegates.BufferDataARB(target, size, ptr, usage); } } GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); try { Delegates.BufferDataARB_IP(target, size, hData.AddrOfPinnedObject(), usage); } finally { hData.Free(); } }
/// <summary> /// Creates a buffer data storage without the actual data /// </summary> /// <param name="target"></param> /// <param name="size"></param> /// <param name="usage"></param> public static void BufferData(BufferTarget target, int size, BufferUsage usage) { Delegates.BufferDataARB_IP(target, size, IntPtr.Zero, usage); }