/// <summary> /// Buffers a part of the client data /// </summary> /// <param name="index">Starting element in the vertex definition</param> /// <param name="count">Number of elements from the vertex definition to buffer</param> /// <remarks>This function cannot be called once the client data has been freed</remarks> public void BufferSubData(int index, int count) { int offset = 0; int size = 0; if (internal_array == null || internal_array.Length == 0) { throw new InvalidOperationException("Cannot buffer data from empty client array"); } for (int i = 0; i < index; i++) { offset += VertexBufferDescriptor.GetElementSize(desc.types[i]); } for (int i = index; i < index + count; i++) { size += VertexBufferDescriptor.GetElementSize(desc.types[i]); } var ptr = System.Runtime.InteropServices.GCHandle.Alloc(internal_array, System.Runtime.InteropServices.GCHandleType.Pinned); OpenGL.glBufferSubData(target, new IntPtr(offset), new IntPtr(size), ptr.AddrOfPinnedObject()); ptr.Free(); }