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); }
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 MemoryAccessInfo[] GetVertexAttributes(this IVertexBuilder firstVertex, int vertexCount, PackedEncoding vertexEncoding) { var tvg = firstVertex.GetGeometry().GetType(); var tvm = firstVertex.GetMaterial().GetType(); var tvs = firstVertex.GetSkinning().GetType(); var attributes = new List <MemoryAccessInfo>(); foreach (var finfo in tvg.GetFields()) { var attribute = _GetMemoryAccessInfo(finfo); if (attribute.HasValue) { attributes.Add(attribute.Value); } } foreach (var finfo in tvm.GetFields()) { var attribute = _GetMemoryAccessInfo(finfo); if (attribute.HasValue) { var a = attribute.Value; if (a.Name.StartsWith("COLOR_", StringComparison.OrdinalIgnoreCase)) { if (vertexEncoding.ColorEncoding.HasValue) { a.Encoding = vertexEncoding.ColorEncoding.Value; a.Normalized = a.Encoding != ENCODING.FLOAT; } } attributes.Add(a); } } foreach (var finfo in tvs.GetFields()) { var attribute = _GetMemoryAccessInfo(finfo); if (attribute.HasValue) { var a = attribute.Value; if (a.Name.StartsWith("JOINTS_", StringComparison.OrdinalIgnoreCase)) { a.Encoding = vertexEncoding.JointsEncoding.Value; } if (a.Name.StartsWith("WEIGHTS_", StringComparison.OrdinalIgnoreCase)) { a.Encoding = vertexEncoding.WeightsEncoding.Value; if (a.Encoding != ENCODING.FLOAT) { a.Normalized = true; } } attributes.Add(a); } } var array = attributes.ToArray(); MemoryAccessInfo.SetInterleavedInfo(array, 0, vertexCount); return(array); }