aboutsummaryrefslogtreecommitdiff
path: root/runtime/src
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2021-03-28 20:35:46 +0800
committershedaniel <daniel@shedaniel.me>2021-03-28 20:35:46 +0800
commitebf2bb9dfa1f0e1abca845d7283e6e74ad8b00cd (patch)
treecc2e4c4d101aaaf5dcbc9dd5cebb9d7f7b3a7982 /runtime/src
parent9d835c7823978e04007414cfe3ebf128e23a6494 (diff)
downloadRoughlyEnoughItems-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')
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java3
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java20
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java10
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/EntryStackSubsetsMenuEntry.java3
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubSubsetsMenuEntry.java3
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchEntryRendererManager.java143
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java232
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java74
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java141
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/SearchProviderImpl.java14
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java11
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java8
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/plugin/test/REITestPlugin.java18
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 {
- renderEntries(debugTime, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, entries);
- }
+ new BatchEntryRendererManager(entries).render(debugTime, size, time, matrices, mouseX, mouseY, delta);
}
if (debugTime) {
@@ -446,12 +341,14 @@ public class EntryListWidget extends WidgetWithBounds {
public void updateArea(String searchTerm) {