/// <summary>Load an <see cref="Asset"/>.</summary> /// <param name="loader"></param> /// <param name="formats"></param> /// <param name="resolveConflict"></param> /// <param name="progress"></param> /// <param name="progressUpdateRate"></param> /// <returns></returns> public static Task <Asset> LoadAssetAsync(AssetLoader loader, IEnumerable <AssetFormat> formats, ResolveLoadConflictCallback resolveConflict = null, AssetLoaderProgressCallback progress = null, TimeSpan?progressUpdateRate = null) { TimeSpan progressUpdateRateValue = progressUpdateRate.GetValueOrDefault(TimeSpan.FromSeconds(0.1)); LoadMatchStrength matchStrength; AssetFormat format = LoadMatchAsset(out matchStrength, loader, formats, resolveConflict); if (loader.Context != null) { loader.Context.LoadErrors = loader.Errors; } return(new Task <Asset>(() => { Asset asset = null; bool complete = false; Thread loadThread = new Thread(() => { asset = format.Load(loader); complete = true; }); loadThread.Start(); while (!complete) { if (!loadThread.IsAlive) { throw new InvalidOperationException("The load operation failed."); } Thread.Sleep(progressUpdateRateValue); if (progress != null) { progress.Invoke(loader); } } return asset; })); }
/// <summary>Load an <see cref="Asset"/> asynchronously.</summary> /// <param name="reader"></param> /// <param name="name"></param> /// <param name="fileManager">The <see cref="FileManager"/> to use. If <c>null</c> (the default), the system file manager is used.</param> /// <param name="context"></param> /// <param name="conflictResolver"></param> /// <param name="progressMonitor"></param> /// <param name="progressUpdateRate"></param> /// <returns></returns> public Task <Asset> LoadAsync(BinaryReader reader, string name, FileManager fileManager, Asset context = null, ResolveLoadConflictCallback conflictResolver = null, AssetLoaderProgressCallback progressMonitor = null, TimeSpan?progressUpdateRate = null) { return(AssetFormat.LoadAssetAsync(new AssetLoader(this, reader, name, fileManager, context), AllEnabledFormats, conflictResolver, progressMonitor, progressUpdateRate)); }
/// <summary>Load an <see cref="Asset"/> from a file asynchronously.</summary> /// <param name="path"></param> /// <param name="fileManager">The <see cref="FileManager"/> to use. If <c>null</c> (the default), the system file manager is used.</param> /// <param name="context"></param> /// <param name="byteOrder"></param> /// <param name="conflictResolver"></param> /// <param name="progressMonitor"></param> /// <param name="progressUpdateRate"></param> /// <returns></returns> public Task <Asset> LoadFileAsync(string path, FileManager fileManager = null, Asset context = null, ByteOrder byteOrder = ByteOrder.LittleEndian, ResolveLoadConflictCallback conflictResolver = null, AssetLoaderProgressCallback progressMonitor = null, TimeSpan?progressUpdateRate = null) { if (fileManager == null) { fileManager = FileManager.System; } Stream stream = fileManager.OpenRead(path); return(LoadAsync(stream, path, fileManager, context, byteOrder, conflictResolver, progressMonitor, progressUpdateRate)); }
/// <summary>Load an <see cref="Asset"/> asynchronously.</summary> /// <param name="stream"></param> /// <param name="name"></param> /// <param name="fileManager">The <see cref="FileManager"/> to use. If <c>null</c> (the default), the system file manager is used.</param> /// <param name="context"></param> /// <param name="byteOrder"></param> /// <param name="conflictResolver"></param> /// <param name="progressMonitor"></param> /// <param name="progressUpdateRate"></param> /// <returns></returns> public Task <Asset> LoadAsync(Stream stream, string name, FileManager fileManager = null, Asset context = null, ByteOrder byteOrder = ByteOrder.LittleEndian, ResolveLoadConflictCallback conflictResolver = null, AssetLoaderProgressCallback progressMonitor = null, TimeSpan?progressUpdateRate = null) { return(LoadAsync(BigEndianBinaryReader.Create(byteOrder, stream), name, fileManager, context, conflictResolver, progressMonitor, progressUpdateRate)); }
/// <summary>Load an <see cref="Asset"/>.</summary> /// <param name="loader"></param> /// <param name="formats"></param> /// <param name="resolveConflict"></param> /// <param name="progress"></param> /// <param name="progressUpdateRate"></param> /// <returns></returns> public static Task<Asset> LoadAssetAsync(AssetLoader loader, IEnumerable<AssetFormat> formats, ResolveLoadConflictCallback resolveConflict = null, AssetLoaderProgressCallback progress = null, TimeSpan? progressUpdateRate = null) { TimeSpan progressUpdateRateValue = progressUpdateRate.GetValueOrDefault(TimeSpan.FromSeconds(0.1)); LoadMatchStrength matchStrength; AssetFormat format = LoadMatchAsset(out matchStrength, loader, formats, resolveConflict); if (loader.Context != null) loader.Context.LoadErrors = loader.Errors; return new Task<Asset>(() => { Asset asset = null; bool complete = false; Thread loadThread = new Thread(() => { asset = format.Load(loader); complete = true; }); loadThread.Start(); while (!complete) { if (!loadThread.IsAlive) throw new InvalidOperationException("The load operation failed."); Thread.Sleep(progressUpdateRateValue); if (progress != null) progress.Invoke(loader); } return asset; }); }