diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-12-18 19:34:26 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2024-04-16 00:38:15 +0900 |
| commit | 8f8db7a604a86d17b88a621a18656e0791d87aeb (patch) | |
| tree | 9ffa54bd808aad60df5122c914aacaa07517082b | |
| parent | 3c9eb139444779b5df6fd986e79f8e5969f5e69c (diff) | |
| download | RoughlyEnoughItems-8f8db7a604a86d17b88a621a18656e0791d87aeb.tar.gz RoughlyEnoughItems-8f8db7a604a86d17b88a621a18656e0791d87aeb.tar.bz2 RoughlyEnoughItems-8f8db7a604a86d17b88a621a18656e0791d87aeb.zip | |
Fix #668
| -rw-r--r-- | runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java index cd44c7434..c42594b3b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java @@ -29,6 +29,8 @@ import com.google.common.collect.Maps; import it.unimi.dsi.fastutil.longs.Long2LongMap; import it.unimi.dsi.fastutil.longs.Long2LongMaps; import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; @@ -122,7 +124,7 @@ public class ViewsImpl implements Views { DisplayRegistry displayRegistry = DisplayRegistry.getInstance(); DisplaysHolder displaysHolder = ((DisplayRegistryImpl) displayRegistry).displaysHolder(); - Map<DisplayCategory<?>, Set<Display>> result = Maps.newLinkedHashMap(); + Map<DisplayCategory<?>, Set<Display>> result = Maps.newHashMap(); forCategories(processingVisibilityHandlers, filteringCategories, displayRegistry, result, (configuration, categoryId, displays, set) -> { if (categories.contains(categoryId)) { // If the category is in the search, add all displays for (Display display : displays) { @@ -217,17 +219,23 @@ public class ViewsImpl implements Views { } }); - Map<DisplayCategory<?>, List<DisplaySpec>> resultSpec = (Map<DisplayCategory<?>, List<DisplaySpec>>) (Map) new LinkedHashMap<>(); - for (CategoryRegistry.CategoryConfiguration<?> configuration : CategoryRegistry.getInstance()) { - Set<Display> displays = result.get(configuration.getCategory()); - if (displays == null) continue; - resultSpec.put(configuration.getCategory(), new ArrayList<>(displays)); + // Merging displays + Stopwatch mergingStopwatch = Stopwatch.createStarted(), sortingStopwatch = Stopwatch.createUnstarted(); + Map<DisplayCategory<?>, List<DisplaySpec>> merged = (Map<DisplayCategory<?>, List<DisplaySpec>>) (Map) new LinkedHashMap<>(); + for (Map.Entry<DisplayCategory<?>, Set<Display>> entry : result.entrySet()) { + merged.put(entry.getKey(), new ArrayList<>(entry.getValue())); } - // optimize displays + if (builder.isMergingDisplays() && ConfigObject.getInstance().doMergeDisplayUnderOne()) { - mergeAndOptimize(result, resultSpec); + mergeAndOptimize(result, merged); } + mergingStopwatch.stop(); + // Sorting displays + sortingStopwatch.start(); + Map<DisplayCategory<?>, List<DisplaySpec>> sorted = sortDisplays(merged); + sortingStopwatch.stop(); + String message = String.format("Built Recipe View in %s for %d categories, %d recipes for, %d usages for and %d live recipe generators.", stopwatch.stop(), categories.size(), recipesForStacks.size(), usagesForStacks.size(), generatorsCount); if (ConfigObject.getInstance().doDebugSearchTimeRequired()) { @@ -235,7 +243,19 @@ public class ViewsImpl implements Views { } else { InternalLogger.getInstance().trace(message); } - return resultSpec; + return sorted; + } + + private static Map<DisplayCategory<?>, List<DisplaySpec>> sortDisplays(Map<DisplayCategory<?>, List<DisplaySpec>> unsorted) { + Object2IntMap<CategoryIdentifier<?>> categoryOrder = new Object2IntOpenHashMap<>(); + categoryOrder.defaultReturnValue(Integer.MAX_VALUE); + int i = 0; + for (CategoryRegistry.CategoryConfiguration<?> configuration : CategoryRegistry.getInstance()) { + categoryOrder.put(configuration.getCategoryIdentifier(), i++); + } + Map<DisplayCategory<?>, List<DisplaySpec>> result = new TreeMap<>(Comparator.comparingInt(category -> categoryOrder.getInt(category.getCategoryIdentifier()))); + result.putAll(unsorted); + return result; } private static void forCategories(boolean processingVisibilityHandlers, Set<CategoryIdentifier<?>> filteringCategories, DisplayRegistry displayRegistry, Map<DisplayCategory<?>, Set<Display>> result, QuadConsumer<CategoryRegistry.CategoryConfiguration<?>, CategoryIdentifier<?>, List<Display>, Set<Display>> displayConsumer) { |
