public AssetLoadResultByLoader Load(AssetLoadInfo loadInfo) { try { if (!skyboxLoader.TryLoad(loadInfo.FileSystem, loadInfo.LoadPath, out var skybox, out var imageFileRelativePathsStr, out var error)) { return(AssetLoadResultByLoader.Failure("FAILED", error)); } var pathsForHashing = new List <string>(); var imageRelativePaths = imageFileRelativePathsStr.Select(x => new FilePath(x)).ToArray(); var paddingCount = imageRelativePaths.Max(x => x.UpCount); var loadFolderPath = new FilePath(Path.GetDirectoryName(loadInfo.LoadPath)); var cacheFolderPath = new FilePath(Enumerable.Range(0, paddingCount).Select(x => "Padding").ToArray()); var mainFileName = Path.GetFileName(loadInfo.LoadPath); var mainFileCachePath = cacheFolderPath.CombineWith(mainFileName).ToString(); pathsForHashing.Add(mainFileCachePath); assetFileCache.CopyCacheFileFrom(loadInfo.AssetName, mainFileCachePath, loadInfo.FileSystem, loadInfo.LoadPath); foreach (var imageFileRelativePath in imageRelativePaths) { var imageCachePath = cacheFolderPath.CombineWith(imageFileRelativePath).ToString(); var imageLoadPath = loadFolderPath.CombineWith(imageFileRelativePath).ToString(); assetFileCache.CopyCacheFileFrom(loadInfo.AssetName, imageCachePath, loadInfo.FileSystem, imageLoadPath); pathsForHashing.Add(imageCachePath); } var hash = AssetHashMd5.FromMultipleFiles(x => assetFileCache.ReadCacheFile(loadInfo.AssetName, x), pathsForHashing); var asset = new Asset(loadInfo.AssetName, skybox, loadInfo.StorageType, hash, loadInfo.ReferencePath, mainFileCachePath); return(AssetLoadResultByLoader.Success(asset)); } catch (Exception ex) { return(AssetLoadResultByLoader.Failure("EXCEPTION", ex)); } }
public AssetLoadResult Load(AssetLoadInfo loadInfo) { var loadPath = loadInfo.LoadPath; var messageBuilder = new StringBuilder(); messageBuilder.AppendLine("Loading " + loadPath); messageBuilder.AppendLine(); messageBuilder.AppendLine("Loader responses:"); if (loadInfo.AssetName != null) { // todo: check if need handle duplicate names here if (assets.ContainsKey(loadInfo.AssetName)) { throw new ArgumentException($"Asset with the name '{loadInfo.AssetName}' is already registered."); } } else { // todo: make AssetLoadInfoForLoader loadInfo.AssetName = GetUniqueAssetName(Path.GetFileNameWithoutExtension(loadPath)); } var fileName = Path.GetFileName(loadPath); foreach (var loader in assetLoaders) { // todo: decide on this check in config if (!loader.LikesName(fileName)) { messageBuilder.AppendLine($"{loader.Name}: wrong file extension"); continue; } var loaderResult = loader.Load(loadInfo); if (loaderResult.Successful) { var asset = loaderResult.Asset; if (!loader.Flags.HasFlag(AssetLoaderFlags.ManualCaching)) { assetFileCache.CopyCacheFileFrom(loadInfo.AssetName, asset.AssetCachePath, loadInfo.FileSystem, loadPath); } assets.Add(loadInfo.AssetName, asset); return(AssetLoadResult.Success(asset)); } messageBuilder.AppendLine($"{loader.Name}: {FilterLoaderMessage(loaderResult.ShortMessage)}"); if (loaderResult.Exception != null) { Log.Write(LogMessageType.HandledError, $"Exception loading asset '{loadPath}':\r\n" + loaderResult.Exception.GetCompleteMessage()); } assetFileCache.DeleteAssetFiles(loaderResult.AssetName); } messageBuilder.AppendLine(); messageBuilder.AppendLine("No loader succeded."); return(AssetLoadResult.Failure(messageBuilder.ToString())); }