diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-03-28 20:35:46 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-03-28 20:35:46 +0800 |
| commit | ebf2bb9dfa1f0e1abca845d7283e6e74ad8b00cd (patch) | |
| tree | cc2e4c4d101aaaf5dcbc9dd5cebb9d7f7b3a7982 /runtime/src/main/java/me | |
| parent | 9d835c7823978e04007414cfe3ebf128e23a6494 (diff) | |
| download | RoughlyEnoughItems-ebf2bb9dfa1f0e1abca845d7283e6e74ad8b00cd.tar.gz RoughlyEnoughItems-ebf2bb9dfa1f0e1abca845d7283e6e74ad8b00cd.tar.bz2 RoughlyEnoughItems-ebf2bb9dfa1f0e1abca845d7283e6e74ad8b00cd.zip | |
Optimise > 1 million entries & Improve Favorites Dragging
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'runtime/src/main/java/me')
16 files changed, 429 insertions, 261 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java index 6a9feabe9..a111dd7fd 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java @@ -352,8 +352,9 @@ public class ConfigManagerImpl implements ConfigManager { }).setSavingRunnable(() -> { saveConfig(); EntryRegistry.getInstance().refilter(); - if (REIHelperImpl.getSearchField() != null) + if (REIHelperImpl.getSearchField() != null) { ContainerScreenOverlay.getEntryListWidget().updateSearch(REIHelperImpl.getSearchField().getText(), true); + } }).build(); }); Screen configScreen = provider.get(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java index adabe8d62..0c41f834c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java @@ -25,6 +25,7 @@ package me.shedaniel.rei.impl.client.config.entries; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.DefaultVertexFormat; @@ -46,6 +47,7 @@ import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; +import me.shedaniel.rei.impl.client.gui.widget.BatchEntryRendererManager; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import net.minecraft.client.Minecraft; @@ -221,16 +223,18 @@ public class FilteringScreen extends Screen { int skip = Math.max(0, Mth.floor(scrolling.scrollAmount / (float) entrySize())); int nextIndex = skip * innerBounds.width / entrySize(); int i = nextIndex; + BatchEntryRendererManager manager = new BatchEntryRendererManager(); for (; i < entryStacks.size(); i++) { - EntryStack stack = entryStacks.get(i); + EntryStack<?> stack = entryStacks.get(i); EntryListEntry entry = entries.get(nextIndex); entry.getBounds().y = (int) (entry.backupY - scrolling.scrollAmount); if (entry.getBounds().y > bounds.getMaxY()) break; entry.entry(stack); - entry.render(matrices, mouseX, mouseY, delta); + manager.add(entry); nextIndex++; } + manager.render(matrices, mouseX, mouseY, delta); updatePosition(delta); scrolling.renderScrollBar(0xff000000, 1, REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); matrices.pushPose(); @@ -243,8 +247,8 @@ public class FilteringScreen extends Screen { matrices.popPose(); ScissorsHandler.INSTANCE.removeLastScissor(); - Tesselator tessellator = Tesselator.getInstance(); - BufferBuilder buffer = tessellator.getBuilder(); + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder buffer = tesselator.getBuilder(); RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(770, 771, 0, 1); RenderSystem.disableAlphaTest(); @@ -256,7 +260,7 @@ public class FilteringScreen extends Screen { buffer.vertex(matrix, width, bounds.y + 4, 0.0F).uv(1.0F, 1.0F).color(0, 0, 0, 0).endVertex(); buffer.vertex(matrix, width, bounds.y, 0.0F).uv(1.0F, 0.0F).color(0, 0, 0, 255).endVertex(); buffer.vertex(matrix, 0, bounds.y, 0.0F).uv(0.0F, 0.0F).color(0, 0, 0, 255).endVertex(); - tessellator.end(); + tesselator.end(); RenderSystem.enableTexture(); RenderSystem.shadeModel(7424); RenderSystem.enableAlphaTest(); @@ -314,11 +318,7 @@ public class FilteringScreen extends Screen { public void updateSearch(String searchTerm) { lastFilter = SearchProvider.getInstance().createFilter(searchTerm); Set<EntryStack<?>> list = Sets.newLinkedHashSet(); - EntryRegistry.getInstance().getEntryStacks().forEach(stack -> { - if (matches(stack)) { - list.add(stack.normalize()); - } - }); + EntryRegistry.getInstance().getEntryStacks().parallel().filter(this::matches).map(EntryStack::normalize).forEachOrdered(list::add); entryStacks = Lists.newArrayList(list); updateEntriesPosition(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java index ef88474a0..c2c69f1a4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java @@ -531,9 +531,11 @@ public class ContainerScreenOverlay extends REIOverlay { if (Minecraft.getInstance().screen instanceof AbstractContainerScreen) { AbstractContainerScreen<?> containerScreen = (AbstractContainerScreen<?>) Minecraft.getInstance().screen; int x = containerScreen.leftPos, y = containerScreen.topPos; - for (Slot slot : containerScreen.getMenu().slots) - if (!slot.hasItem() || !ENTRY_LIST_WIDGET.matches(EntryStacks.of(slot.getItem()))) + for (Slot slot : containerScreen.getMenu().slots) { + if (!slot.hasItem() || !ENTRY_LIST_WIDGET.matches(EntryStacks.of(slot.getItem()))) { fillGradient(matrices, x + slot.x, y + slot.y, x + slot.x + 16, y + slot.y + 16, -601874400, -601874400); + } + } } matrices.popPose(); } @@ -696,7 +698,7 @@ public class ContainerScreenOverlay extends REIOverlay { ConfigManager.getInstance().saveConfig(); FavoritesListWidget favoritesListWidget = ContainerScreenOverlay.getFavoritesListWidget(); if (favoritesListWidget != null) - favoritesListWidget.updateSearch(ContainerScreenOverlay.getEntryListWidget(), REIHelperImpl.getSearchField().getText()); + favoritesListWidget.updateSearch(); return true; } } @@ -757,7 +759,7 @@ public class ContainerScreenOverlay extends REIOverlay { ConfigManager.getInstance().saveConfig(); FavoritesListWidget favoritesListWidget = ContainerScreenOverlay.getFavoritesListWidget(); if (favoritesListWidget != null) - favoritesListWidget.updateSearch(ContainerScreenOverlay.getEntryListWidget(), REIHelper.getInstance().getSearchTextField().getText()); + favoritesListWidget.updateSearch(); return true; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/EntryStackSubsetsMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/EntryStackSubsetsMenuEntry.java index 74174d60f..a449df7d1 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/EntryStackSubsetsMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/EntryStackSubsetsMenuEntry.java @@ -107,8 +107,9 @@ public class EntryStackSubsetsMenuEntry extends MenuEntry { recalculateFilter(menu); ConfigManager.getInstance().saveConfig(); EntryRegistry.getInstance().refilter(); - if (REIHelperImpl.getSearchField() != null) + if (REIHelperImpl.getSearchField() != null) { ContainerScreenOverlay.getEntryListWidget().updateSearch(REIHelperImpl.getSearchField().getText(), true); + } } } else if (!RoughlyEnoughItemsCore.isLeftMousePressed) clickedLast = false; } else clickedLast = false; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubSubsetsMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubSubsetsMenuEntry.java index 4a33aa7d6..36c3426b6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubSubsetsMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubSubsetsMenuEntry.java @@ -157,8 +157,9 @@ public class SubSubsetsMenuEntry extends MenuEntry { setFiltered(filteredStacks, overlay, this, !(getFilteredRatio() > 0)); ConfigManager.getInstance().saveConfig(); EntryRegistry.getInstance().refilter(); - if (REIHelperImpl.getSearchField() != null) + if (REIHelperImpl.getSearchField() != null) { ContainerScreenOverlay.getEntryListWidget().updateSearch(REIHelperImpl.getSearchField().getText(), true); + } } else { clickedBefore = true; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchEntryRendererManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchEntryRendererManager.java new file mode 100644 index 000000000..6cafecb90 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchEntryRendererManager.java @@ -0,0 +1,143 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020 shedaniel + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.shedaniel.rei.impl.client.gui.widget; + +import com.google.common.collect.Iterables; +import com.mojang.blaze3d.vertex.PoseStack; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.entry.renderer.BatchEntryRenderer; +import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; +import me.shedaniel.rei.api.common.entry.EntryStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import org.apache.commons.lang3.mutable.MutableInt; +import org.apache.commons.lang3.mutable.MutableLong; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class BatchEntryRendererManager { + private boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); + private Int2ObjectMap<List<EntryWidget>> grouping = new Int2ObjectOpenHashMap<>(); + private List<EntryWidget> toRender = new ArrayList<>(); + + public BatchEntryRendererManager() { + } + + public BatchEntryRendererManager(Collection<? extends EntryWidget> widgets) { + addAll(widgets); + } + + public void addAll(Collection<? extends EntryWidget> widgets) { + if (fastEntryRendering) { + for (EntryWidget widget : widgets) { + add(widget); + } + } else { + toRender.addAll(widgets); + } + } + + public void add(EntryWidget widget) { + if (fastEntryRendering) { + EntryStack<?> currentEntry = widget.getCurrentEntry(); + EntryRenderer<?> renderer = currentEntry.getRenderer(); + if (renderer instanceof BatchEntryRenderer) { + int hash = ((BatchEntryRenderer<Object>) renderer).getBatchId(currentEntry.cast()); + List<EntryWidget> entries = grouping.get(hash); + if (entries == null) { + grouping.put(hash, entries = new ArrayList<>()); + } + entries.add(widget); + return; + } + } + toRender.add(widget); + } + + public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { + render(false, null, null, matrices, mouseX, mouseY, delta); + } + + public void render(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta) { + if (fastEntryRendering) { + for (List<EntryWidget> entries : grouping.values()) { + renderEntries(debugTime, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, entries); + } + } + if (!toRender.isEmpty()) { + renderEntries(debugTime, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, toRender); + } + } + + + public static <T extends EntryWidget> void renderEntries(boolean debugTime, MutableInt size, MutableLong time, boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable<T> entries) { + T firstWidget = Iterables.getFirst(entries, null); + if (firstWidget == null) return; + @SuppressWarnings("rawtypes") + EntryStack first = firstWidget.getCurrentEntry(); + EntryRenderer<?> renderer = first.getRenderer(); + if (fastEntryRendering && renderer instanceof BatchEntryRenderer) { + BatchEntryRenderer<?> firstRenderer = (BatchEntryRenderer<?>) renderer; + firstRenderer.startBatch(first, matrices, delta); + long l = debugTime ? System.nanoTime() : 0; + MultiBufferSource.BufferSource immediate = Minecraft.getInstance().renderBuffers().bufferSource(); + for (T listEntry : entries) { + @SuppressWarnings("rawtypes") + EntryStack currentEntry = listEntry.getCurrentEntry(); + currentEntry.setZ(100); + listEntry.drawBackground(matrices, mouseX, mouseY, delta); + firstRenderer.renderBase(currentEntry, matrices, immediate, listEntry.getInnerBounds(), mouseX, mouseY, delta); + if (debugTime && !currentEntry.isEmpty()) size.increment(); + } + immediate.endBatch(); + for (T listEntry : entries) { + @SuppressWarnings("rawtypes") + EntryStack currentEntry = listEntry.getCurrentEntry(); + firstRenderer.renderOverlay(currentEntry, matrices, immediate, listEntry.getInnerBounds(), mouseX, mouseY, delta); + if (listEntry.containsMouse(mouseX, mouseY)) { + listEntry.queueTooltip(matrices, mouseX, mouseY, delta); + listEntry.drawHighlighted(matrices, mouseX, mouseY, delta); + } + } + immediate.endBatch(); + if (debugTime) time.add(System.nanoTime() - l); + firstRenderer.endBatch(first, matrices, delta); + } else { + for (T entry : entries) { + if (entry.getCurrentEntry().isEmpty()) + continue; + if (debugTime) { + size.increment(); + long l = System.nanoTime(); + entry.render(matrices, mouseX, mouseY, delta); + time.add(System.nanoTime() - l); + } else entry.render(matrices, mouseX, mouseY, delta); + } + } + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java index 5d4917fba..ec57bf1d1 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java @@ -24,15 +24,10 @@ package me.shedaniel.rei.impl.client.gui.widget; import com.google.common.base.Stopwatch; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.math.Matrix4f; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import it.unimi.dsi.fastutil.ints.IntSet; import me.shedaniel.architectury.fluid.FluidStack; import me.shedaniel.clothconfig2.ClothConfigInitializer; import me.shedaniel.clothconfig2.api.ScissorsHandler; @@ -47,26 +42,20 @@ import me.shedaniel.rei.api.client.REIHelper; import me.shedaniel.rei.api.client.REIOverlay; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; -import me.shedaniel.rei.api.client.entry.renderer.BatchEntryRenderer; -import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.client.gui.config.EntryPanelOrdering; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; -import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; -import me.shedaniel.rei.api.client.search.SearchFilter; -import me.shedaniel.rei.api.client.search.SearchProvider; -import me.shedaniel.rei.api.client.view.Views; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; -import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.ClientHelperImpl; import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; +import me.shedaniel.rei.impl.client.search.AsyncSearchManager; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.player.LocalPlayer; @@ -83,15 +72,9 @@ import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.lang3.mutable.MutableLong; import org.jetbrains.annotations.ApiStatus; -import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.function.Consumer; import java.util.stream.Collectors; @ApiStatus.Internal @@ -121,24 +104,19 @@ public class EntryListWidget extends WidgetWithBounds { }; protected int blockedCount; private boolean debugTime; - private double lastAverageDebugTime; - private double averageDebugTime; - private double lastTotalDebugTime; - private double totalDebugTime; - private float totalDebugTimeDelta; + private double lastAverageDebugTime, averageDebugTime, lastTotalDebugTime, totalDebugTime, totalDebugTimeDelta; private Rectangle bounds, innerBounds; private List<EntryStack<?>> allStacks = null; private List<EntryListEntry> entries = Collections.emptyList(); private List<Widget> renders = Collections.emptyList(); private List<Widget> widgets = Collections.emptyList(); - private SearchFilter lastFilter = SearchFilter.matchAll(); - private String lastSearchTerm = null; + private AsyncSearchManager searchManager = AsyncSearchManager.createDefault(); public static int entrySize() { return Mth.ceil(SIZE * ConfigObject.getInstance().getEntrySize()); } - static boolean notSteppingOnExclusionZones(int left, int top, int width, int height, Rectangle listArea) { + public static boolean notSteppingOnExclusionZones(int left, int top, int width, int height, Rectangle listArea) { Minecraft instance = Minecraft.getInstance(); for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(instance.screen)) { InteractionResult fit = canItemSlotWidgetFit(left, top, width, height, decider); @@ -174,31 +152,33 @@ public class EntryListWidget extends WidgetWithBounds { int entrySize = entrySize(); if (ConfigObject.getInstance().isEntryListWidgetScrolled()) { int width = Math.max(Mth.floor((bounds.width - 2 - 6) / (float) entrySize), 1); - if (ConfigObject.getInstance().isLeftHandSidePanel()) + if (ConfigObject.getInstance().isLeftHandSidePanel()) { return new Rectangle((int) (bounds.getCenterX() - width * (entrySize / 2f) + 3), bounds.y, width * entrySize, bounds.height); + } return new Rectangle((int) (bounds.getCenterX() - width * (entrySize / 2f) - 3), bounds.y, width * entrySize, bounds.height); + } else { + int width = Math.max(Mth.floor((bounds.width - 2) / (float) entrySize), 1); + int height = Math.max(Mth.floor((bounds.height - 2) / (float) entrySize), 1); + return new Rectangle((int) (bounds.getCenterX() - width * (entrySize / 2f)), (int) (bounds.getCenterY() - height * (entrySize / 2f)), width * entrySize, height * entrySize); } - int width = Math.max(Mth.floor((bounds.width - 2) / (float) entrySize), 1); - int height = Math.max(Mth.floor((bounds.height - 2) / (float) entrySize), 1); - return new Rectangle((int) (bounds.getCenterX() - width * (entrySize / 2f)), (int) (bounds.getCenterY() - height * (entrySize / 2f)), width * entrySize, height * entrySize); } @Override - public boolean mouseScrolled(double double_1, double double_2, double double_3) { - if (bounds.contains(double_1, double_2)) { + public boolean mouseScrolled(double mouseX, double mouseY, double amount) { + if (bounds.contains(mouseX, mouseY)) { if (Screen.hasControlDown()) { ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); - if (config.setEntrySize(config.getEntrySize() + double_3 * 0.075)) { + if (config.setEntrySize(config.getEntrySize() + amount * 0.075)) { ConfigManager.getInstance().saveConfig(); REIHelper.getInstance().getOverlay().ifPresent(REIOverlay::queueReloadOverlay); return true; } } else if (ConfigObject.getInstance().isEntryListWidgetScrolled()) { - scrolling.offset(ClothConfigInitializer.getScrollStep() * -double_3, true); + scrolling.offset(ClothConfigInitializer.getScrollStep() * -amount, true); return true; } } - return super.mouseScrolled(double_1, double_2, double_3); + return super.mouseScrolled(mouseX, mouseY, amount); } @Override @@ -228,59 +208,6 @@ public class EntryListWidget extends WidgetWithBounds { return Mth.ceil(allStacks.size() / (float) entries.size()); } - public static <T extends EntryListEntryWidget> void renderEntries(MutableInt size, MutableLong time, boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable<T> entries) { - renderEntries(true, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, entries); - } - - public static <T extends EntryListEntryWidget> void renderEntries(boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable<T> entries) { - renderEntries(false, null, null, fastEntryRendering, matrices, mouseX, mouseY, delta, entries); - } - - public static <T extends EntryListEntryWidget> void renderEntries(boolean debugTime, MutableInt size, MutableLong time, boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable<T> entries) { - T firstWidget = Iterables.getFirst(entries, null); - if (firstWidget == null) return; - @SuppressWarnings("rawtypes") - EntryStack first = firstWidget.getCurrentEntry(); - EntryRenderer<?> renderer = first.getRenderer(); - if (fastEntryRendering && renderer instanceof BatchEntryRenderer) { - BatchEntryRenderer<?> firstRenderer = (BatchEntryRenderer<?>) renderer; - firstRenderer.startBatch(first, matrices, delta); - long l = debugTime ? System.nanoTime() : 0; - MultiBufferSource.BufferSource immediate = Minecraft.getInstance().renderBuffers().bufferSource(); - for (T listEntry : entries) { - @SuppressWarnings("rawtypes") - EntryStack currentEntry = listEntry.getCurrentEntry(); - currentEntry.setZ(100); - listEntry.drawBackground(matrices, mouseX, mouseY, delta); - firstRenderer.renderBase(currentEntry, matrices, immediate, listEntry.getInnerBounds(), mouseX, mouseY, delta); - if (debugTime && !currentEntry.isEmpty()) size.increment(); - } - immediate.endBatch(); - for (T listEntry : entries) { - @SuppressWarnings("rawtypes") - EntryStack currentEntry = listEntry.getCurrentEntry(); - firstRenderer.renderOverlay(currentEntry, matrices, listEntry.getInnerBounds(), mouseX, mouseY, delta); - if (listEntry.containsMouse(mouseX, mouseY)) { - listEntry.queueTooltip(matrices, mouseX, mouseY, delta); - listEntry.drawHighlighted(matrices, mouseX, mouseY, delta); - } - } - if (debugTime) time.add(System.nanoTime() - l); - firstRenderer.endBatch(first, matrices, delta); - } else { - for (T entry : entries) { - if (entry.getCurrentEntry().isEmpty()) - continue; - if (debugTime) { - size.increment(); - long l = System.nanoTime(); - entry.render(matrices, mouseX, mouseY, delta); - time.add(System.nanoTime() - l); - } else entry.render(matrices, mouseX, mouseY, delta); - } - } - } - @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { MutableInt size = new MutableInt(); @@ -292,56 +219,30 @@ public class EntryListWidget extends WidgetWithBounds { int skip = Math.max(0, Mth.floor(scrolling.scrollAmount / (float) entrySize())); int nextIndex = skip * innerBounds.width / entrySize(); - int i = nextIndex; - int cont = nextIndex; - blockedCount = 0; + this.blockedCount = 0; + BatchEntryRendererManager helper = new BatchEntryRendererManager(); - Int2ObjectMap<List<EntryListEntry>> grouping = new Int2ObjectOpenHashMap<>(); - List<EntryListEntry> toRender = new ArrayList<>(); - Consumer<EntryListEntry> add; - - if (fastEntryRendering) { - add = entry -> { - int hash = BatchEntryRenderer.getBatchIdFrom(entry.getCurrentEntry()); - List<EntryListEntry> entries = grouping.get(hash); - - if (entries == null) { - grouping.put(hash, entries = new ArrayList<>()); - } - - entries.add(entry); - }; - } else { - add = toRender::add; - } - - for (; cont < entries.size(); cont++) { + int i = nextIndex; + for (int cont = nextIndex; cont < entries.size(); cont++) { EntryListEntry entry = entries.get(cont); - Rectangle entryBounds = entry.getBounds(); entryBounds.y = (int) (entry.backupY - scrolling.scrollAmount); if (entryBounds.y > this.bounds.getMaxY()) break; if (allStacks.size() <= i) break; if (notSteppingOnExclusionZones(entryBounds.x, entryBounds.y, entryBounds.width, entryBounds.height, innerBounds)) { - EntryStack stack = allStacks.get(i++); + EntryStack<?> stack = allStacks.get(i++); + entry.clearStacks(); if (!stack.isEmpty()) { - entry.clearStacks(); entry.entry(stack); - add.accept(entry); + helper.add(entry); } } else { blockedCount++; } } - if (fastEntryRendering) { - for (List<EntryListEntry> entries : grouping.values()) { - renderEntries(debugTime, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, entries); - } - } else { - renderEntries(debugTime, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, toRender); - } + helper.render(debugTime, size, time, matrices, mouseX, mouseY, delta); updatePosition(delta); ScissorsHandler.INSTANCE.removeLastScissor(); @@ -352,13 +253,7 @@ public class EntryListWidget extends WidgetWithBounds { for (Widget widget : renders) { widget.render(matrices, mouseX, mouseY, delta); } - if (fastEntryRendering) { - entries.stream().collect(Collectors.groupingBy(entryListEntry -> BatchEntryRenderer.getBatchIdFrom(entryListEntry.getCurrentEntry()))).forEach((integer, entries) -> { - renderEntries(debugTime, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, entries); - }); - } else { |
