private static Vbo genVBO <TVertex>(TVertex[] vertices, short[] elements) where TVertex : struct { Debug.Trace("VBOCube generated -> vertices: " + vertices.Length + "; elements: " + elements.Length); Vbo vbo = new Vbo(); int size; GL.GenBuffers(1, out vbo.vboID); GL.BindBuffer(BufferTarget.ArrayBuffer, vbo.vboID); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * BlittableValueType.StrideOf(vertices)), vertices, BufferUsageHint.StaticDraw); //GL.BufferData<Vertex>(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * Vertex.SizeInBytes), vertices, BufferUsageHint.StaticDraw); //GL.InterleavedArrays(InterleavedArrayFormat.C4ubV3f, 0, IntPtr.Zero); GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out size); if (vertices.Length * BlittableValueType.StrideOf(vertices) != size) { throw new ApplicationException("Vertex data not uploaded correctly"); } GL.GenBuffers(1, out vbo.eboID); GL.BindBuffer(BufferTarget.ElementArrayBuffer, vbo.eboID); GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(elements.Length * sizeof(short)), elements, BufferUsageHint.StaticDraw); GL.GetBufferParameter(BufferTarget.ElementArrayBuffer, BufferParameterName.BufferSize, out size); if (elements.Length * sizeof(short) != size) { throw new ApplicationException("Element data not uploaded correctly"); } vbo.numElements = elements.Length; vbo.sizeOfVertices = BlittableValueType.StrideOf(vertices); return(vbo); }
public VBOPrimitive(int name, VertexPositionColor[] vertices, short[] elements) : base(name) { if (!wasGenerated) { vbo = genVBO(vertices, elements); wasGenerated = true; } }