public static MemoryAccessor[] CreateVertexMemoryAccessors <TVertex>(this IReadOnlyList <TVertex> vertices, PackedEncoding vertexEncoding) where TVertex : IVertexBuilder { if (vertices == null || vertices.Count == 0) { return(null); } vertexEncoding.AdjustJointEncoding(vertices); // determine the vertex attributes from the first vertex. var attributes = GetVertexAttributes(vertices[0], vertices.Count, vertexEncoding); // create a buffer int byteStride = attributes[0].ByteStride; var vbuffer = new ArraySegment <byte>(new Byte[byteStride * vertices.Count]); // fill the buffer with the vertex attributes. var accessors = MemoryAccessInfo .Slice(attributes, 0, vertices.Count) .Select(item => new MemoryAccessor(vbuffer, item)) .ToArray(); foreach (var accessor in accessors) { accessor.FillAccessor(vertices); } MemoryAccessor.SanitizeVertexAttributes(accessors); return(accessors); }
public static MemoryAccessor CreateVertexMemoryAccessor <TVertex>(this IReadOnlyList <TVertex> vertices, string attributeName, PackedEncoding vertexEncoding) where TVertex : IVertexBuilder { if (vertices == null || vertices.Count == 0) { return(null); } vertexEncoding.AdjustJointEncoding(vertices); // determine the vertex attributes from the first vertex. var attributes = GetVertexAttributes(vertices[0], vertices.Count, vertexEncoding); var attribute = attributes.FirstOrDefault(item => item.Name == attributeName); if (attribute.Name == null) { return(null); } attribute.ByteOffset = 0; attribute.ByteStride = 0; // create a buffer var vbuffer = new ArraySegment <byte>(new Byte[attribute.StepByteLength * vertices.Count]); // fill the buffer with the vertex attributes. var accessor = new MemoryAccessor(vbuffer, attribute); accessor.FillAccessor(vertices); return(accessor); }