aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2020-07-18 15:41:13 +0800
committershedaniel <daniel@shedaniel.me>2020-07-18 15:41:13 +0800
commitd4d23b0b0170f605463c49f5790e7326c7e38cf2 (patch)
tree77d6ef0d22d5582158ac966e2ebf99b54a78e197 /src/main/java
parentd57067c1e6cd6fb400d43cfc4149515df1fb8435 (diff)
downloadRoughlyEnoughItems-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')
-rw-r--r--src/main/java/me/shedaniel/rei/api/RecipeHelper.java5
-rw-r--r--src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java53
-rw-r--r--src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java42
-rw-r--r--src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java24
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java289
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java21
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java40
-rw-r--r--src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java5
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java1
-rw-r--r--src/main/java/me/shedaniel/rei/impl/InternalWidgets.java18
-rw-r--r--src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java67
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/information/DefaultInformationCategory.java5
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