示例#1
0
        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));
            }
        }
示例#2
0
        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()));
        }