private HashSet <string> GetChangedAssetIdsForResolver(IAssetDependencyResolver resolver, string[] pathes, long[] timestamps, FileToAssetNode[] fileToAssetNodes) { HashSet <string> result = new HashSet <string>(); Dictionary <string, FileToAssetNode> list = RelationLookup.RelationLookupBuilder.ConvertToDictionary(fileToAssetNodes); string id = resolver.GetId(); string progressBarTitle = $"AssetDependencyCache: {id}"; float lastDisplayedPercentage = 0; for (int i = 0; i < pathes.Length; ++i) { float progressPercentage = (float)i / pathes.Length; if (progressPercentage - lastDisplayedPercentage > 0.01f) { EditorUtility.DisplayProgressBar(progressBarTitle, $"Finding changed assets {result.Count}", (float)i / pathes.Length); lastDisplayedPercentage = progressPercentage; } string path = pathes[i]; string guid = AssetDatabase.AssetPathToGUID(path); if (!resolver.IsGuidValid(guid)) { continue; } if (list.ContainsKey(guid)) { FileToAssetNode fileToAssetNode = list[guid]; foreach (AssetNode assetNode in fileToAssetNode.AssetNodes) { assetNode.Existing = true; } if (fileToAssetNode.GetResolverTimeStamp(id).TimeStamp != timestamps[i]) { NodeDependencyLookupUtility.AddAssetsToList(result, path); } } else { NodeDependencyLookupUtility.AddAssetsToList(result, path); } } return(result); }
private FileToAssetNode[] GetDependenciesForAssets(FileToAssetNode[] fileToAssetNodes, CreatedDependencyCache createdDependencyCache, ProgressBase progress) { string[] pathes = NodeDependencyLookupUtility.GetAllAssetPathes(progress, true); long[] timestamps = NodeDependencyLookupUtility.GetTimeStampsForFiles(pathes); List <AssetResolverData> data = new List <AssetResolverData>(); _hierarchyTraverser.Clear(); foreach (CreatedResolver resolverUsage in createdDependencyCache.ResolverUsages) { if (!(resolverUsage.Resolver is IAssetDependencyResolver)) { continue; } IAssetDependencyResolver resolver = (IAssetDependencyResolver)resolverUsage.Resolver; HashSet <string> changedAssets = GetChangedAssetIdsForResolver(resolver, pathes, timestamps, _fileToAssetNodes); data.Add(new AssetResolverData { ChangedAssets = changedAssets, Resolver = resolver }); resolver.Initialize(this, changedAssets, progress); } // Execute the searcher for all registered subsystems here to find hierarchy and property pathes _hierarchyTraverser.Initialize(progress); _hierarchyTraverser.Search(); Dictionary <string, FileToAssetNode> nodeDict = RelationLookup.RelationLookupBuilder.ConvertToDictionary(fileToAssetNodes); foreach (AssetResolverData resolverData in data) { GetDependenciesForAssetsInResolver(resolverData.ChangedAssets, resolverData.Resolver as IAssetDependencyResolver, nodeDict, progress); } return(nodeDict.Values.ToArray()); }
private bool CheckNeedsUpdateForResolver(IAssetDependencyResolver resolver, string[] pathes, long[] timestamps, FileToAssetNode[] fileToAssetNodes) { Dictionary <string, FileToAssetNode> list = RelationLookup.RelationLookupBuilder.ConvertToDictionary(fileToAssetNodes); string id = resolver.GetId(); string progressBarTitle = $"AssetDependencyCache: {id}"; for (int i = 0; i < pathes.Length; ++i) { EditorUtility.DisplayProgressBar(progressBarTitle, "Checking for required update", (float)i / pathes.Length); string path = pathes[i]; string guid = AssetDatabase.AssetPathToGUID(path); if (!resolver.IsGuidValid(guid)) { continue; } if (list.ContainsKey(guid)) { FileToAssetNode fileToAssetNode = list[guid]; foreach (AssetNode assetNode in fileToAssetNode.AssetNodes) { assetNode.Existing = true; } if (fileToAssetNode.GetResolverTimeStamp(id).TimeStamp != timestamps[i]) { return(true); } } else { return(true); } } return(false); }
public bool NeedsUpdate(ProgressBase progress) { string[] assetIds = NodeDependencyLookupUtility.GetAllAssetPathes(progress, true); long[] timeStampsForFiles = NodeDependencyLookupUtility.GetTimeStampsForFiles(assetIds); foreach (CreatedResolver resolverUsage in _createdDependencyCache.ResolverUsages) { IAssetDependencyResolver assetDependencyResolver = resolverUsage.Resolver as IAssetDependencyResolver; assetDependencyResolver.SetValidGUIDs(); } foreach (CreatedResolver resolverUsage in _createdDependencyCache.ResolverUsages) { IAssetDependencyResolver assetDependencyResolver = resolverUsage.Resolver as IAssetDependencyResolver; if (CheckNeedsUpdateForResolver(assetDependencyResolver, assetIds, timeStampsForFiles, _fileToAssetNodes)) { return(true); } } return(false); }
private void GetDependenciesForAssetsInResolver(HashSet <string> changedAssets, IAssetDependencyResolver resolver, Dictionary <string, FileToAssetNode> resultList, ProgressBase progress) { string resolverId = resolver.GetId(); foreach (string assetId in changedAssets) { string fileId = NodeDependencyLookupUtility.GetGuidFromAssetId(assetId); if (!resultList.ContainsKey(fileId)) { resultList.Add(fileId, new FileToAssetNode { FileId = fileId }); } FileToAssetNode fileToAssetNode = resultList[fileId]; AssetNode assetNode = fileToAssetNode.GetAssetNode(assetId); List <Dependency> dependencies = new List <Dependency>(); resolver.GetDependenciesForId(assetId, dependencies); AssetNode.ResolverData resolverData = assetNode.GetResolverData(resolverId); resolverData.Dependencies = dependencies; fileToAssetNode.GetResolverTimeStamp(resolverId).TimeStamp = NodeDependencyLookupUtility.GetTimeStampForFileId(fileId); } }