private void PlatformDrawUserIndexedPrimitives <T>(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices, int[] indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct { ApplyState(true); // Unbind current VBOs. GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GraphicsExtensions.CheckGLError(); GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); GraphicsExtensions.CheckGLError(); _vertexBuffersDirty = _indexBufferDirty = true; // Pin the buffers. var vbHandle = GCHandle.Alloc(vertexData, GCHandleType.Pinned); var ibHandle = GCHandle.Alloc(indexData, GCHandleType.Pinned); var vertexAddr = (IntPtr)(vbHandle.AddrOfPinnedObject().ToInt64() + vertexDeclaration.VertexStride * vertexOffset); // Setup the vertex declaration to point at the VB data. vertexDeclaration.GraphicsDevice = this; vertexDeclaration.Apply(_vertexShader, vertexAddr); //Draw GL.DrawElements(PrimitiveTypeGL(primitiveType), GetElementCountArray(primitiveType, primitiveCount), DrawElementsType.UnsignedInt, (IntPtr)(ibHandle.AddrOfPinnedObject().ToInt64() + (indexOffset * sizeof(int)))); GraphicsExtensions.CheckGLError(); // Release the handles. ibHandle.Free(); vbHandle.Free(); }
private void PlatformDrawUserPrimitives <T>(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, VertexDeclaration vertexDeclaration, int vertexCount) where T : struct { ApplyState(true); // Unbind current VBOs. GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GraphicsExtensions.CheckGLError(); GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); GraphicsExtensions.CheckGLError(); _vertexBuffersDirty = _indexBufferDirty = true; // Pin the buffers. var vbHandle = GCHandle.Alloc(vertexData, GCHandleType.Pinned); // Setup the vertex declaration to point at the VB data. vertexDeclaration.GraphicsDevice = this; vertexDeclaration.Apply(_vertexShader, vbHandle.AddrOfPinnedObject()); //Draw GL.DrawArrays(PrimitiveTypeGL(primitiveType), vertexOffset, vertexCount); GraphicsExtensions.CheckGLError(); // Release the handles. vbHandle.Free(); }