Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }