protected override Task ExportFileImpl(Scene scene, string filePath)
        {
            if (scene.Meshes == null || scene.Meshes.Count != 1)
            {
                throw new ArgumentException("Can only deal with scenes containing a single mesh");
            }

            return(Task.Run(() =>
            {
                var mesh = scene.Meshes[0];
                var plyFile = ConstructPlyFile(mesh, filePath);

                var headerParser = new PlyHeaderReaderWriter();
                headerParser.WriteFileStructure(plyFile);

                using (var elementReadWriter = PlyReaderWriterFactory.GetReaderWriter(plyFile, OperationType.Export))
                {
                    elementReadWriter.WriteElements(mesh);
                }

                File.SetCreationTime(filePath, DateTime.Now);
            }));
        }
        public override Task <Scene> ImportFileImpl(string filePath)
        {
            return(Task.Run(() =>
            {
                var mesh = new Mesh();
                var scene = new Scene();
                scene.Meshes.Add(mesh);

                var headerParser = new PlyHeaderReaderWriter();
                PlyFile plyFile = headerParser.ReadFileStructure(filePath);

                if (plyFile.Header.PlyFileFormat == PlyFileFormat.BinaryBigEndian)
                {
                    throw new Exception($"{nameof(PlyFileFormat.BinaryBigEndian)} format is not currently supported");
                }

                using var elementReadWriter = PlyReaderWriterFactory.GetReaderWriter(plyFile, OperationType.Import);

                BuildElements(elementReadWriter, plyFile);
                BuildMeshStructure(mesh, plyFile);

                return scene;
            }));
        }