diff options
| author | shedaniel <daniel@shedaniel.me> | 2020-07-18 15:41:13 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2020-07-18 15:41:13 +0800 |
| commit | d4d23b0b0170f605463c49f5790e7326c7e38cf2 (patch) | |
| tree | 77d6ef0d22d5582158ac966e2ebf99b54a78e197 /src/main/java | |
| parent | d57067c1e6cd6fb400d43cfc4149515df1fb8435 (diff) | |
| download | RoughlyEnoughItems-d4d23b0b0170f605463c49f5790e7326c7e38cf2.tar.gz RoughlyEnoughItems-d4d23b0b0170f605463c49f5790e7326c7e38cf2.tar.bz2 RoughlyEnoughItems-d4d23b0b0170f605463c49f5790e7326c7e38cf2.zip | |
Fix #385 and optimise favourites rendering
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'src/main/java')
12 files changed, 300 insertions, 270 deletions
diff --git a/src/main/java/me/shedaniel/rei/api/RecipeHelper.java b/src/main/java/me/shedaniel/rei/api/RecipeHelper.java index b46280a63..70682dad8 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeHelper.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeHelper.java @@ -134,10 +134,11 @@ public interface RecipeHelper { * @param display the recipe display * @deprecated Use {@link RecipeHelper#registerDisplay(RecipeDisplay)} */ - @ApiStatus.Internal @ApiStatus.ScheduledForRemoval @Deprecated - void registerDisplay(Identifier categoryIdentifier, RecipeDisplay display); + default void registerDisplay(Identifier categoryIdentifier, RecipeDisplay display) { + registerDisplay(display); + } Map<RecipeCategory<?>, List<RecipeDisplay>> buildMapFor(ClientHelper.ViewSearchBuilder builder); diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index 4bf587829..fc8c69ee0 100644 --- a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -690,35 +690,57 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl } @Override - public boolean mouseClicked(double double_1, double double_2, int int_1) { + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (ConfigObject.getInstance().getHideKeybind().matchesMouse(button)) { + ScreenHelper.toggleOverlayVisible(); + return true; + } + EntryStack stack = RecipeHelper.getInstance().getScreenFocusedStack(MinecraftClient.getInstance().currentScreen); + if (stack != null && !stack.isEmpty()) { + stack = stack.copy(); + if (ConfigObject.getInstance().getRecipeKeybind().matchesMouse(button)) { + return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addRecipesFor(stack).setOutputNotice(stack).fillPreferredOpenedCategory()); + } else if (ConfigObject.getInstance().getUsageKeybind().matchesMouse(button)) { + return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory()); + } else if (ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { + stack.setAmount(127); + if (!CollectionUtils.anyMatchEqualsEntryIgnoreAmount(ConfigObject.getInstance().getFavorites(), stack)) + ConfigObject.getInstance().getFavorites().add(stack); + ConfigManager.getInstance().saveConfig(); + FavoritesListWidget favoritesListWidget = ContainerScreenOverlay.getFavoritesListWidget(); + if (favoritesListWidget != null) + favoritesListWidget.updateSearch(ContainerScreenOverlay.getEntryListWidget(), ScreenHelper.getSearchField().getText()); + return true; + } + } if (!ScreenHelper.isOverlayVisible()) return false; - if (wrappedSubsetsMenu != null && wrappedSubsetsMenu.mouseClicked(double_1, double_2, int_1)) { + if (wrappedSubsetsMenu != null && wrappedSubsetsMenu.mouseClicked(mouseX, mouseY, button)) { this.setFocused(wrappedSubsetsMenu); - if (int_1 == 0) + if (button == 0) this.setDragging(true); ScreenHelper.getSearchField().setFocused(false); return true; } if (wrappedWeatherMenu != null) { - if (wrappedWeatherMenu.mouseClicked(double_1, double_2, int_1)) { + if (wrappedWeatherMenu.mouseClicked(mouseX, mouseY, button)) { this.setFocused(wrappedWeatherMenu); - if (int_1 == 0) + if (button == 0) this.setDragging(true); ScreenHelper.getSearchField().setFocused(false); return true; - } else if (!wrappedWeatherMenu.containsMouse(double_1, double_2) && !weatherButton.containsMouse(double_1, double_2)) { + } else if (!wrappedWeatherMenu.containsMouse(mouseX, mouseY) && !weatherButton.containsMouse(mouseX, mouseY)) { removeWeatherMenu(); } } if (wrappedGameModeMenu != null) { - if (wrappedGameModeMenu.mouseClicked(double_1, double_2, int_1)) { + if (wrappedGameModeMenu.mouseClicked(mouseX, mouseY, button)) { this.setFocused(wrappedGameModeMenu); - if (int_1 == 0) + if (button == 0) this.setDragging(true); ScreenHelper.getSearchField().setFocused(false); return true; - } else if (!wrappedGameModeMenu.containsMouse(double_1, double_2) && !gameModeButton.containsMouse(double_1, double_2)) { + } else if (!wrappedGameModeMenu.containsMouse(mouseX, mouseY) && !gameModeButton.containsMouse(mouseX, mouseY)) { removeGameModeMenu(); } } @@ -726,21 +748,28 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl ContainerScreen<?> containerScreen = (ContainerScreen<?>) MinecraftClient.getInstance().currentScreen; for (RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas()) if (area.getScreenClass().equals(containerScreen.getClass())) - if (area.getRectangle().contains(double_1 - containerScreen.x, double_2 - containerScreen.y)) { + if (area.getRectangle().contains(mouseX - containerScreen.x, mouseY - containerScreen.y)) { ClientHelper.getInstance().executeViewAllRecipesFromCategories(Arrays.asList(area.getCategories())); MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); return true; } } for (Element element : widgets) - if (element != wrappedSubsetsMenu && element != wrappedWeatherMenu && element != wrappedGameModeMenu && element.mouseClicked(double_1, double_2, int_1)) { + if (element != wrappedSubsetsMenu && element != wrappedWeatherMenu && element != wrappedGameModeMenu && element.mouseClicked(mouseX, mouseY, button)) { this.setFocused(element); - if (int_1 == 0) + if (button == 0) this.setDragging(true); if (!(element instanceof OverlaySearchField)) ScreenHelper.getSearchField().setFocused(false); return true; } + if (ConfigObject.getInstance().getFocusSearchFieldKeybind().matchesMouse(button)) { + ScreenHelper.getSearchField().setFocused(true); + setFocused(ScreenHelper.getSearchField()); + ScreenHelper.getSearchField().keybindFocusTime = -1; + ScreenHelper.getSearchField().keybindFocusKey = -1; + return true; + } return false; } diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index 12464c636..ad9a63011 100644 --- a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -431,7 +431,7 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { ScreenHelper.getLastOverlay().lateRender(matrices, mouseX, mouseY, delta); { ModifierKeyCode export = ConfigObject.getInstance().getExportImageKeybind(); - if (export.matchesCurrentKey()) { + if (export.matchesCurrentKey() || export.matchesCurrentMouse()) { for (Map.Entry<Rectangle, List<Widget>> entry : recipeBounds.entrySet()) { Rectangle bounds = entry.getKey(); setZOffset(470); @@ -506,14 +506,25 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { } @Override - public boolean mouseReleased(double double_1, double double_2, int int_1) { + public boolean mouseReleased(double mouseX, double mouseY, int button) { if (choosePageActivated) { - return recipeChoosePageWidget.mouseReleased(double_1, double_2, int_1); + return recipeChoosePageWidget.mouseReleased(mouseX, mouseY, button); + } else { + ModifierKeyCode export = ConfigObject.getInstance().getExportImageKeybind(); + if (export.matchesMouse(button)) { + for (Map.Entry<Rectangle, List<Widget>> entry : recipeBounds.entrySet()) { + Rectangle bounds = entry.getKey(); + if (bounds.contains(PointHelper.ofMouse())) { + RecipeDisplayExporter.exportRecipeDisplay(bounds, entry.getValue()); + break; + } + } + } } for (Element entry : children()) - if (entry.mouseReleased(double_1, double_2, int_1)) + if (entry.mouseReleased(mouseX, mouseY, button)) return true; - return super.mouseReleased(double_1, double_2, int_1); + return super.mouseReleased(mouseX, mouseY, button); } @Override @@ -537,19 +548,28 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { } @Override - public boolean mouseClicked(double double_1, double double_2, int int_1) { - if (choosePageActivated) - if (recipeChoosePageWidget.containsMouse(double_1, double_2)) { - return recipeChoosePageWidget.mouseClicked(double_1, double_2, int_1); + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (choosePageActivated) { + if (recipeChoosePageWidget.containsMouse(mouseX, mouseY)) { + return recipeChoosePageWidget.mouseClicked(mouseX, mouseY, button); } else { choosePageActivated = false; init(); return false; } + } else if (ConfigObject.getInstance().getNextPageKeybind().matchesMouse(button)) { + if (recipeNext.isEnabled()) + recipeNext.onClick(); + return recipeNext.isEnabled(); + } else if (ConfigObject.getInstance().getPreviousPageKeybind().matchesMouse(button)) { + if (recipeBack.isEnabled()) + recipeBack.onClick(); + return recipeBack.isEnabled(); + } for (Element entry : children()) - if (entry.mouseClicked(double_1, double_2, int_1)) { + if (entry.mouseClicked(mouseX, mouseY, button)) { setFocused(entry); - if (int_1 == 0) + if (button == 0) setDragging(true); return true; } diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java index 6d75f7d23..5a405f08b 100644 --- a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -253,19 +253,32 @@ public class VillagerRecipeViewingScreen extends Screen implements RecipeScreen } @Override - public boolean mouseClicked(double mouseX, double mouseY, int int_1) { - if (scrolling.updateDraggingState(mouseX, mouseY, int_1)) { + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (scrolling.updateDraggingState(mouseX, mouseY, button)) { scrollBarAlpha = 1; return true; } + if (ConfigObject.getInstance().getNextPageKeybind().matchesMouse(button)) { + selectedRecipeIndex++; + if (selectedRecipeIndex >= categoryMap.get(categories.get(selectedCategoryIndex)).size()) + selectedRecipeIndex = 0; + init(); + return true; + } else if (ConfigObject.getInstance().getPreviousPageKeybind().matchesMouse(button)) { + selectedRecipeIndex--; + if (selectedRecipeIndex < 0) + selectedRecipeIndex = categoryMap.get(categories.get(selectedCategoryIndex)).size() - 1; + init(); + return true; + } for (Element entry : children()) - if (entry.mouseClicked(mouseX, mouseY, int_1)) { + if (entry.mouseClicked(mouseX, mouseY, button)) { setFocused(entry); - if (int_1 == 0) + if (button == 0) setDragging(true); return true; } - return super.mouseClicked(mouseX, mouseY, int_1); + return super.mouseClicked(mouseX, mouseY, button); } @Override @@ -296,6 +309,7 @@ public class VillagerRecipeViewingScreen extends Screen implements RecipeScreen if (selectedRecipeIndex >= categoryMap.get(categories.get(selectedCategoryIndex)).size()) selectedRecipeIndex = 0; init(); + return true; } else if (categoryMap.get(categories.get(selectedCategoryIndex)).size() > 1) { selectedRecipeIndex--; if (selectedRecipeIndex < 0) diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java index f2e5a6f31..a0c8cc792 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java @@ -64,6 +64,7 @@ import java.util.Set; import java.util.concurrent.*; import java.util.function.Supplier; import java.util.stream.Collectors; +import java.util.stream.Stream; @ApiStatus.Internal public class EntryListWidget extends WidgetWithBounds { @@ -94,6 +95,11 @@ 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 Rectangle bounds, innerBounds; private List<EntryStack> allStacks = null; private List<EntryListEntry> entries = Collections.emptyList(); @@ -111,10 +117,10 @@ public class EntryListWidget extends WidgetWithBounds { for (OverlayDecider decider : DisplayHelper.getInstance().getSortedOverlayDeciders(instance.currentScreen.getClass())) { ActionResult fit = decider.isInZone(left, top); if (fit == ActionResult.FAIL) - return fit == ActionResult.SUCCESS; + return false; ActionResult fit2 = decider.isInZone(left + 18, top + 18); if (fit2 == ActionResult.FAIL) - return fit == ActionResult.SUCCESS; + return false; if (fit == ActionResult.SUCCESS && fit2 == ActionResult.SUCCESS) return true; } @@ -170,199 +176,132 @@ public class EntryListWidget extends WidgetWithBounds { return MathHelper.ceil(allStacks.size() / (float) entries.size()); } + public static void renderEntries(boolean debugTime, int[] size, long[] time, boolean fastEntryRendering, MatrixStack matrices, int mouseX, int mouseY, float delta, List<EntryListEntryWidget> entries) { + if (entries.isEmpty()) return; + EntryListEntryWidget firstWidget = entries.get(0); + EntryStack first = firstWidget.getCurrentEntry(); + if (fastEntryRendering && first instanceof OptimalEntryStack) { + OptimalEntryStack firstStack = (OptimalEntryStack) first; + firstStack.optimisedRenderStart(matrices, delta); + long l = debugTime ? System.nanoTime() : 0; + VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); + for (EntryListEntryWidget listEntry : entries) { + EntryStack currentEntry = listEntry.getCurrentEntry(); + currentEntry.setZ(100); + listEntry.drawBackground(matrices, mouseX, mouseY, delta); + ((OptimalEntryStack) currentEntry).optimisedRenderBase(matrices, immediate, listEntry.getInnerBounds(), mouseX, mouseY, delta); + if (debugTime && !currentEntry.isEmpty()) size[0]++; + } + immediate.draw(); + for (EntryListEntryWidget listEntry : entries) { + EntryStack currentEntry = listEntry.getCurrentEntry(); + ((OptimalEntryStack) currentEntry).optimisedRenderOverlay(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[0] += (System.nanoTime() - l); + firstStack.optimisedRenderEnd(matrices, delta); + } else { + for (EntryListEntryWidget entry : entries) { + if (entry.getCurrentEntry().isEmpty()) + continue; + if (debugTime) { + size[0]++; + long l = System.nanoTime(); + entry.render(matrices, mouseX, mouseY, delta); + time[0] += (System.nanoTime() - l); + } else entry.render(matrices, mouseX, mouseY, delta); + } + } + } + @Override public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + int[] size = {0}; + long[] time = {0}; + long totalTimeStart = debugTime ? System.nanoTime() : 0; + boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); if (ConfigObject.getInstance().isEntryListWidgetScrolled()) { for (EntryListEntry entry : entries) entry.clearStacks(); ScissorsHandler.INSTANCE.scissor(bounds); + int skip = Math.max(0, MathHelper.floor(scrolling.scrollAmount / (float) entrySize())); int nextIndex = skip * innerBounds.width / entrySize(); - int i = nextIndex; + int[] i = {nextIndex}; blockedCount = 0; - if (debugTime) { - long totalTimeStart = System.nanoTime(); - int size = 0; - long time = 0; - back: - for (; i < allStacks.size(); i++) { - EntryStack stack = allStacks.get(i); - while (true) { - EntryListEntry entry = entries.get(nextIndex); - entry.getBounds().y = (int) (entry.backupY - scrolling.scrollAmount); - if (entry.getBounds().y > bounds.getMaxY()) - break back; - if (notSteppingOnExclusionZones(entry.getBounds().x, entry.getBounds().y, innerBounds)) { - entry.entry(stack); - if (!entry.getCurrentEntry().isEmpty()) { - size++; - long l = System.nanoTime(); - entry.render(matrices, mouseX, mouseY, delta); - time += (System.nanoTime() - l); - } - nextIndex++; - break; - } else { - blockedCount++; - nextIndex++; - } + + Stream<EntryListEntry> entryStream = this.entries.stream().skip(nextIndex).filter(entry -> { + entry.getBounds().y = (int) (entry.backupY - scrolling.scrollAmount); + if (entry.getBounds().y > bounds.getMaxY()) return false; + if (notSteppingOnExclusionZones(entry.getBounds().x, entry.getBounds().y, innerBounds)) { + EntryStack stack = allStacks.get(i[0]++); + if (!stack.isEmpty()) { + entry.entry(stack); + return true; } + } else { + blockedCount++; } - long totalTime = System.nanoTime() - totalTimeStart; - int z = getZ(); - setZ(500); - Text debugText = new LiteralText(String.format("%d entries, avg. %.0fns, ttl. %.0fms, %s fps", size, time / (double) size, totalTime / 1000000d, minecraft.fpsDebugString.split(" ")[0])); - fillGradient(matrices, bounds.x, bounds.y, bounds.x + font.getWidth(debugText) + 2, bounds.y + font.fontHeight + 2, -16777216, -16777216); - VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer()); - matrices.push(); - matrices.translate(0.0D, 0.0D, getZ()); - Matrix4f matrix = matrices.peek().getModel(); - font.draw(debugText, bounds.x + 2, bounds.y + 2, -1, false, matrix, immediate, false, 0, 15728880); - immediate.draw(); - setZ(z); - matrices.pop(); + return false; + }).limit(allStacks.size() - i[0]); + + if (fastEntryRendering) { + entryStream.collect(Collectors.groupingBy(entryListEntry -> OptimalEntryStack.groupingHashFrom(entryListEntry.getCurrentEntry()))).forEach((integer, entries) -> { + renderEntries(debugTime, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, (List) entries); + }); } else { - back: - for (; i < allStacks.size(); i++) { - EntryStack stack = allStacks.get(i); - while (true) { - EntryListEntry entry = entries.get(nextIndex); - entry.getBounds().y = (int) (entry.backupY - scrolling.scrollAmount); - if (entry.getBounds().y > bounds.getMaxY()) - break back; - if (notSteppingOnExclusionZones(entry.getBounds().x, entry.getBounds().y, innerBounds)) { - entry.entry(stack); - entry.render(matrices, mouseX, mouseY, delta); - nextIndex++; - break; - } else { - blockedCount++; - nextIndex++; - } - } - } + renderEntries(debugTime, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, entryStream.collect(Collectors.toList())); } + updatePosition(delta); ScissorsHandler.INSTANCE.removeLastScissor(); scrolling.renderScrollBar(0, 1, REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); } else { - if (debugTime) { - int[] size = {0}; - long[] time = {0}; - for (Widget widget : renders) { - widget.render(matrices, mouseX, mouseY, delta); - } - long totalTimeStart = System.nanoTime(); - if (ConfigObject.getInstance().doesFastEntryRendering()) { - entries.stream().collect(Collectors.groupingBy(entryListEntry -> OptimalEntryStack.groupingHashFrom(entryListEntry.getCurrentEntry()))).forEach((integer, entries) -> { - if (entries.isEmpty()) return; - EntryListEntry firstWidget = entries.get(0); - EntryStack first = firstWidget.getCurrentEntry(); - if (first instanceof OptimalEntryStack) { - OptimalEntryStack firstStack = (OptimalEntryStack) first; - firstStack.optimisedRenderStart(matrices, delta); - long l = System.nanoTime(); - VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); - for (EntryListEntry listEntry : entries) { - EntryStack currentEntry = listEntry.getCurrentEntry(); - currentEntry.setZ(100); - listEntry.drawBackground(matrices, mouseX, mouseY, delta); - ((OptimalEntryStack) currentEntry).optimisedRenderBase(matrices, immediate, listEntry.getInnerBounds(), mouseX, mouseY, delta); - if (!currentEntry.isEmpty()) - size[0]++; - } - immediate.draw(); - for (EntryListEntry listEntry : entries) { - EntryStack currentEntry = listEntry.getCurrentEntry(); - ((OptimalEntryStack) currentEntry).optimisedRenderOverlay(matrices, listEntry.getInnerBounds(), mouseX, mouseY, delta); - if (listEntry.containsMouse(mouseX, mouseY)) { - listEntry.queueTooltip(matrices, mouseX, mouseY, delta); - listEntry.drawHighlighted(matrices, mouseX, mouseY, delta); - } - } - time[0] += (System.nanoTime() - l); - firstStack.optimisedRenderEnd(matrices, delta); - } else { - for (EntryListEntry listEntry : entries) { - if (listEntry.getCurrentEntry().isEmpty()) - continue; - size[0]++; - long l = System.nanoTime(); - listEntry.render(matrices, mouseX, mouseY, delta); - time[0] += (System.nanoTime() - l); - } - } - }); - } else { - for (EntryListEntry entry : entries) { - if (entry.getCurrentEntry().isEmpty()) - continue; - size[0]++; - long l = System.nanoTime(); - entry.render(matrices, mouseX, mouseY, delta); - time[0] += (System.nanoTime() - l); - } - } - long totalTime = System.nanoTime() - totalTimeStart; - int z = getZ(); - setZ(500); - Text debugText = new LiteralText(String.format("%d entries, avg. %.0fns, ttl. %.0fms, %s fps", size[0], time[0] / (double) size[0], totalTime / 1000000d, minecraft.fpsDebugString.split(" ")[0])); - int stringWidth = font.getWidth(debugText); - fillGradient(matrices, Math.min(bounds.x, minecraft.currentScreen.width - stringWidth - 2), bounds.y, bounds.x + stringWidth + 2, bounds.y + font.fontHeight + 2, -16777216, -16777216); - VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer()); - matrices.push(); - matrices.translate(0.0D, 0.0D, getZ()); - Matrix4f matrix = matrices.peek().getModel(); - font.draw(debugText, Math.min(bounds.x + 2, minecraft.currentScreen.width - stringWidth), bounds.y + 2, -1, false, matrix, immediate, false, 0, 15728880); - immediate.draw(); - setZ(z); - matrices.pop(); + for (Widget widget : renders) { + widget.render(matrices, mouseX, mouseY, delta); + } + if (fastEntryRendering) { + entries.stream().collect(Collectors.groupingBy(entryListEntry -> OptimalEntryStack.groupingHashFrom(entryListEntry.getCurrentEntry()))).forEach((integer, entries) -> { + renderEntries(debugTime, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, (List) entries); + }); } else { - for (Widget widget : renders) { - widget.render(matrices, mouseX, mouseY, delta); - } - if (ConfigObject.getInstance().doesFastEntryRendering()) { - entries.stream().collect(Collectors.groupingBy(entryListEntry -> OptimalEntryStack.groupingHashFrom(entryListEntry.getCurrentEntry()))).forEach((integer, entries) -> { - if (entries.isEmpty()) return; - EntryListEntry firstWidget = entries.get(0); - EntryStack first = firstWidget.getCurrentEntry(); - if (first instanceof OptimalEntryStack) { - OptimalEntryStack firstStack = (OptimalEntryStack) first; - firstStack.optimisedRenderStart(matrices, delta); - VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); - for (EntryListEntry listEntry : entries) { - EntryStack currentEntry = listEntry.getCurrentEntry(); - currentEntry.setZ(100); - listEntry.drawBackground(matrices, mouseX, mouseY, delta); - ((OptimalEntryStack) currentEntry).optimisedRenderBase(matrices, immediate, listEntry.getInnerBounds(), mouseX, mouseY, delta); - } - immediate.draw(); - for (EntryListEntry listEntry : entries) { - EntryStack currentEntry = listEntry.getCurrentEntry(); - ((OptimalEntryStack) currentEntry).optimisedRenderOverlay(matrices, listEntry.getInnerBounds(), mouseX, mouseY, delta); - if (listEntry.containsMouse(mouseX, mouseY)) { - listEntry.queueTooltip(matrices, mouseX, mouseY, delta); - listEntry.drawHighlighted(matrices, mouseX, mouseY, delta); - } - } - firstStack.optimisedRenderEnd(matrices, delta); - } else { - for (EntryListEntry listEntry : entries) { - if (listEntry.getCurrentEntry().isEmpty()) - continue; - listEntry.render(matrices, mouseX, mouseY, delta); - } - } - }); - } else { - for (EntryListEntry listEntry : entries) { - if (listEntry.getCurrentEntry().isEmpty()) - continue; - listEntry.render(matrices, mouseX, mouseY, delta); - } - } + renderEntries(debugTime, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, (List) entries); } } + + if (debugTime) { + long totalTime = System.nanoTime() - totalTimeStart; + averageDebugTime += (time[0] / (double) size[0]) * delta; + totalDebugTime += totalTime / 1000000d * delta; + totalDebugTimeDelta += delta; + if (totalDebugTimeDelta >= 20) { + lastAverageDebugTime = averageDebugTime / totalDebugTimeDelta; + lastTotalDebugTime = totalDebugTime / totalDebugTimeDelta; + averageDebugTime = 0; + totalDebugTime = 0; + totalDebugTimeDelta = 0; + } else if (lastAverageDebugTime == 0) { + lastAverageDebugTime = time[0] / (double) size[0]; + totalDebugTime = totalTime / 1000000d; + } + int z = getZ(); + setZ(500); + Text debugText = new LiteralText(String.format("%d entries, avg. %.0fns, ttl. %.2fms, %s fps", size[0], lastAverageDebugTime, lastTotalDebugTime, minecraft.fpsDebugString.split(" ")[0])); + int stringWidth = font.getWidth(debugText); + fillGradient(matrices, Math.min(bounds.x, minecraft.currentScreen.width - stringWidth - 2), bounds.y, bounds.x + stringWidth + 2, bounds.y + font.fontHeight + 2, -16777216, -16777216); + VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer()); + matrices.push(); + matrices.translate(0.0D, 0.0D, getZ()); + Matrix4f matrix = matrices.peek().getModel(); + font.draw(debugText, Math.min(bounds.x + 2, minecraft.currentScreen.width - stringWidth), bounds.y + 2, -1, false, matrix, immediate, false, 0, 15728880); + immediate.draw(); + setZ(z); + matrices.pop(); + } + if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating() && !minecraft.player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.canDeleteItems()) { EntryStack stack = EntryStack.create(minecraft.player.inventory.getCursorStack().copy()); if (stack.getType() == EntryStack.Type.FLUID) { diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java index 2389fbdc6..d7d60af40 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java @@ -36,6 +36,7 @@ import me.shedaniel.rei.impl.ScreenHelper; import me.shedaniel.rei.utils.CollectionUtils; import net.minecraft.client.gui.Element; import net.minecraft.client.resource.language.I18n; +import net.minec |
