Пример #1
0
        public Mesh (MemoryBlock vertices, VertexLayout decl, ushort[] indices) {
            var group = new MeshGroup();
            group.VertexBuffer = new VertexBuffer(vertices, decl);
            group.IndexBuffer = new IndexBuffer(MemoryBlock.FromArray(indices));

            vertexDecl = decl;
            groups = new List<MeshGroup> { group };
        }
Пример #2
0
        public unsafe static Mesh LoadMesh(string fileName)
        {
            var          path   = Path.Combine(RootPath, "meshes/", fileName);
            var          groups = new List <MeshGroup>();
            var          group  = new MeshGroup();
            VertexLayout layout = null;

            using (var reader = new MemoryReader(File.ReadAllBytes(path))) {
                while (!reader.Done)
                {
                    var tag = reader.Read <uint>();
                    if (tag == ChunkTagVB)
                    {
                        // skip bounding volume info
                        reader.Skip(BoundingVolumeSize);

                        layout = ReadVertexLayout(reader);

                        var vertexCount = reader.Read <ushort>();
                        var vertexData  = reader.ReadArray <byte>(vertexCount * layout.Stride);
                        group.VertexBuffer = new VertexBuffer(MemoryBlock.FromArray(vertexData), layout);
                    }
                    else if (tag == ChunkTagIB)
                    {
                        var indexCount = reader.Read <uint>();
                        var indexData  = reader.ReadArray <ushort>((int)indexCount);

                        group.IndexBuffer = new IndexBuffer(MemoryBlock.FromArray(indexData));
                    }
                    else if (tag == ChunkTagPri)
                    {
                        // skip material name
                        var len = reader.Read <ushort>();
                        reader.Skip(len);

                        // read primitive data
                        var count = reader.Read <ushort>();
                        for (int i = 0; i < count; i++)
                        {
                            // skip name
                            len = reader.Read <ushort>();
                            reader.Skip(len);

                            var prim = reader.Read <Primitive>();
                            group.Primitives.Add(prim);

                            // skip bounding volumes
                            reader.Skip(BoundingVolumeSize);
                        }

                        groups.Add(group);
                        group = new MeshGroup();
                    }
                }
            }
            return(new Mesh(layout, groups));
        }
Пример #3
0
        public Mesh(MemoryBlock vertices, VertexLayout decl, ushort[] indices)
        {
            var group = new MeshGroup();

            group.VertexBuffer = new VertexBuffer(vertices, decl);
            group.IndexBuffer  = new IndexBuffer(MemoryBlock.FromArray(indices));

            vertexDecl = decl;
            groups     = new List <MeshGroup> {
                group
            };
        }
Пример #4
0
        public static Mesh LoadMesh(string fileName)
        {
            var          path   = Path.Combine(RootPath, "meshes/", fileName);
            var          groups = new List <MeshGroup>();
            var          group  = new MeshGroup();
            VertexLayout layout = null;

            using (var file = MemoryMappedFile.CreateFromFile(path)) {
                var reader = file.CreateViewAccessor();
                var bytes  = new FileInfo(path).Length;
                var index  = 0;

                while (index < bytes)
                {
                    var tag = reader.ReadUInt32(index); index += sizeof(uint);
                    if (tag == ChunkTagVB)
                    {
                        // skip bounding volume info
                        index += BoundingVolumeSize;

                        layout = reader.ReadVertexLayout(ref index);

                        var vertexCount = reader.ReadUInt16(ref index);
                        var vertexData  = reader.ReadArray <byte>(vertexCount * layout.Stride, ref index);
                        group.VertexBuffer = new VertexBuffer(MemoryBlock.FromArray(vertexData), layout);
                    }
                    else if (tag == ChunkTagIB)
                    {
                        var indexCount = reader.ReadUInt32(ref index);
                        var indexData  = reader.ReadArray <ushort>((int)indexCount, ref index);

                        group.IndexBuffer = new IndexBuffer(MemoryBlock.FromArray(indexData));
                    }
                    else if (tag == ChunkTagPri)
                    {
                        // skip material name
                        var len = reader.ReadUInt16(ref index);
                        index += len;

                        // read primitive data
                        var count = reader.ReadUInt16(ref index);
                        for (int i = 0; i < count; i++)
                        {
                            // skip name
                            len    = reader.ReadUInt16(ref index);
                            index += len;

                            var prim = reader.Read <Primitive>(ref index);
                            group.Primitives.Add(prim);

                            // skip bounding volumes
                            index += BoundingVolumeSize;
                        }

                        groups.Add(group);
                        group = new MeshGroup();
                    }
                }
            }

            return(new Mesh(layout, groups));
        }