Пример #1
0
 public void update(AssetUpdate data, int workers, Ref <float> progress, ILog log)
 {
     process(
         data, workers,
         pathToGuid: pathToGuid, parents: parents, children: children,
         progress: progress, log: log
         );
 }
Пример #2
0
 static void initTasks()
 {
     enabledSubscription = enabled.subscribe(NoOpDisposableTracker.instance, b => {
         if (b)
         {
             refsOpt = Option <AssetReferences> .None;
             processFiles(AssetUpdate.fromAllAssets(AssetDatabase.GetAllAssetPaths().ToImmutableList()));
         }
     });
 }
Пример #3
0
        public static AssetReferences a(
            AssetUpdate data, int workers, Ref <float> progress, ILog log
            )
        {
            var refs = new AssetReferences();

            process(
                data, workers,
                pathToGuid: refs.pathToGuid, parents: refs.parents, children: refs.children,
                progress: progress, log: log
                );
            return(refs);
        }
Пример #4
0
        static void process(AssetUpdate data, ILog log)
        {
            try {
                processing   = true;
                needsRepaint = true;

                refsOpt.voidFold(
                    () => refsOpt = AssetReferences.a(data, Environment.ProcessorCount, progress, log).some(),
                    refs => refs.update(data, Environment.ProcessorCount, progress, log)
                    );
            }
            finally {
                processing = false;
            }
        }
Пример #5
0
        public static void processFiles(AssetUpdate data)
        {
            if (!enabled.value)
            {
                return;
            }
            var log = Log.@default;

            worker.EnqueueItem(() => {
                try {
                    process(data, log);
                }
                catch (Exception e) {
                    log.error(e);
                }
            });
        }
Пример #6
0
        static void OnPostprocessAllAssets(
            string[] importedAssets, string[] deletedAssets, string[] movedAssets,
            string[] movedFromAssetPaths
            )
        {
            if (!AssetReferencesWindow.enabled.value)
            {
                return;
            }

            var data = new AssetUpdate(
                importedAssets.ToImmutableList(),
                deletedAssets.ToImmutableList(),
                movedFromAssetPaths.zip(movedAssets).Select(t => new AssetUpdate.Move(t._1, t._2)).ToImmutableList()
                );

            AssetReferencesWindow.processFiles(data);
        }
Пример #7
0
        static void process(
            AssetUpdate data, int workers,
            Dictionary <string, string> pathToGuid,
            Dictionary <string, HashSet <string> > parents,
            Dictionary <string, HashSet <string> > children,
            Ref <float> progress, ILog log
            )
        {
            progress.value = 0;
            Func <string, bool> predicate = p =>
                                            p.EndsWithFast(".asset") ||
                                            p.EndsWithFast(".prefab") ||
                                            p.EndsWithFast(".unity") ||
                                            p.EndsWithFast(".mat");

            var assets          = data.filter(predicate, _ => predicate(_.fromPath));
            var firstScan       = children.isEmpty() && parents.isEmpty();
            var updatedChildren =
                firstScan
        ? children
        : new Dictionary <string, HashSet <string> >();

            var    progressIdx    = 0;
            Action updateProgress = () => progress.value = (float)progressIdx / assets.totalAssets;

            var addedPool = new PCQueue(workers);

            foreach (var added in assets.newAssets)
            {
                updateProgress();
                addedPool.EnqueueItem(() => {
                    parseFile(pathToGuid, log, added, updatedChildren);
                    lock (data) {
                        progressIdx++;
                        updateProgress();
                    }
                });
            }
            // Block until parallel part is done.
            addedPool.Shutdown(waitForWorkers: true);

            foreach (var deleted in assets.deletedAssets)
            {
                updateProgress();
                if (pathToGuid.ContainsKey(deleted))
                {
                    updatedChildren.getOrUpdate(pathToGuid[deleted], () => new HashSet <string>());
                    pathToGuid.Remove(deleted);
                }
                progressIdx++;
            }
            foreach (var moved in assets.movedAssets)
            {
                updateProgress();
                foreach (var guid in pathToGuid.getAndRemove(moved.fromPath))
                {
                    pathToGuid[moved.toPath] = guid;
                }
                progressIdx++;
            }
            updateProgress();

            if (!firstScan)
            {
                foreach (var parent in updatedChildren.Keys)
                {
                    if (children.ContainsKey(parent))
                    {
                        var set = children[parent];
                        foreach (var child in set)
                        {
                            parents[child].Remove(parent);
                        }
                        children.Remove(parent);
                    }
                }
            }
            addParents(parents, updatedChildren);
            if (!firstScan)
            {
                foreach (var kv in updatedChildren)
                {
                    if (kv.Value.Count > 0)
                    {
                        children.Add(kv.Key, kv.Value);
                    }
                }
            }
        }