public Connection(IStreamAccessor streamAccessor) { var stream = streamAccessor.Stream; Reader = new EndianBinaryReader(EndianBitConverter.Big, stream); Writer = new EndianBinaryWriter(EndianBitConverter.Big, stream); RecordReaderStrategy = new PlaintextStrategy(this); RecordWriterStrategy = new PlaintextStrategy(this); }
public static VeldridGeometry Create(IMesh mesh) { var gpuMesh = mesh.ToGpuMesh(); var result = new VeldridGeometry(); var bufferViewToPrimitive = new Dictionary <IBufferView, VeldridPrimitive>(); var vertexBufferMemoryStream = new MemoryStream(); result.IndexFormat = Veldrid.IndexFormat.UInt16; using (var vertexBufferWriter = new BinaryWriter(vertexBufferMemoryStream)) { foreach (var bufferView in gpuMesh.BufferViews) { var veldridPrimitive = new VeldridPrimitive(); veldridPrimitive.VertexBufferOffset = (uint)vertexBufferMemoryStream.Position; var streamKeys = bufferView.GetStreams().Select(_ => new SortableStreamKey(_)).OrderBy(_ => _) .Select(_ => _.Key).ToList(); var elements = new VertexElementDescription[streamKeys.Count]; var accessors = new IStreamAccessor[streamKeys.Count]; for (var index = 0; index < streamKeys.Count; index++) { var reader = accessors[index] = GetAccessor(bufferView, streamKeys[index]); elements[index] = new VertexElementDescription(streamKeys[index].ToString(), VertexElementSemantic.TextureCoordinate, reader.VertexElementFormat); } var count = accessors[0].Count; if (count > ushort.MaxValue) { result.IndexFormat = Veldrid.IndexFormat.UInt32; } for (var index = 0; index < count; index++) { for (var accessorIndex = 0; accessorIndex < accessors.Length; accessorIndex++) { accessors[accessorIndex].Write(index, vertexBufferWriter); } } veldridPrimitive.VertexLayout = new VertexLayoutDescription(elements); bufferViewToPrimitive.Add(bufferView, veldridPrimitive); } } result.VertexBuffer = new Memory <byte>(vertexBufferMemoryStream.ToArray()); var indexBufferMemoryStream = new MemoryStream(); result.Primitives = new VeldridPrimitive[gpuMesh.Primitives.Count]; using (var indexBufferWriter = new BinaryWriter(indexBufferMemoryStream)) { for (var primitiveIndex = 0; primitiveIndex < gpuMesh.Primitives.Count; primitiveIndex++) { var primitive = gpuMesh.Primitives[primitiveIndex]; var primitiveBase = bufferViewToPrimitive[primitive.BufferView]; var veldridPrimitive = new VeldridPrimitive() { VertexBufferOffset = primitiveBase.VertexBufferOffset, PrimitiveTopology = GetTopology(primitive.Topology), IndexBufferOffset = (uint)indexBufferMemoryStream.Position, VertexLayout = primitiveBase.VertexLayout }; if (result.IndexFormat == Veldrid.IndexFormat.UInt32) { foreach (var index in primitive) { indexBufferWriter.Write((uint)index); } } else if (result.IndexFormat == Veldrid.IndexFormat.UInt16) { foreach (var index in primitive) { indexBufferWriter.Write((ushort)index); } } else { throw new NotImplementedException(); } result.Primitives[primitiveIndex] = veldridPrimitive; } } result.IndexBuffer = new Memory <byte>(indexBufferMemoryStream.ToArray()); return(result); }