/// <summary>
        /// Creates a vertex buffer from the data added so far
        /// </summary>
        public IVertexBuffer Build( )
        {
            int numVertices = -1;
            foreach ( KeyValuePair<VertexFieldSemantic, List<float>> kvp in m_Streams )
            {
                int streamVertexCount = kvp.Value.Count / m_Format.GetDescriptor( kvp.Key ).NumElements;
                if ( numVertices == -1 )
                {
                    numVertices = streamVertexCount;
                    continue;
                }
                if ( numVertices != streamVertexCount )
                {
                    throw new InvalidOperationException( string.Format( "Expected stream for field \"{0}\" to contain {1} vertices, not {2}", kvp.Key, numVertices, streamVertexCount ) );
                }
            }

            VertexBufferData data = new VertexBufferData( m_Format, numVertices );
            foreach ( KeyValuePair<VertexFieldSemantic, List<float>> kvp in m_Streams )
            {
                float[] elements = data.Add<float>( kvp.Key, m_Format.GetDescriptor( kvp.Key ).NumElements );
                Debug.Assert( elements.Length == kvp.Value.Count );

                for ( int elementIndex = 0; elementIndex < elements.Length; ++elementIndex )
                {
                    elements[ elementIndex ] = kvp.Value[ elementIndex ];
                }
            }

            IVertexBuffer vb = Graphics.Factory.CreateVertexBuffer( );
            vb.Create( data );
            return vb;
        }