From 8341de88a57ffe7c6be6634314ce7f18bccaf28e Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 10 Apr 2021 02:29:48 +0800 Subject: Primitive port to 21w14a Signed-off-by: shedaniel --- .../shedaniel/rei/RoughlyEnoughItemsNetwork.java | 22 ++-- .../rei/impl/client/ClientHelperImpl.java | 27 ++-- .../shedaniel/rei/impl/client/REIHelperImpl.java | 1 + .../config/entries/FilteringRulesScreen.java | 3 +- .../client/config/entries/FilteringScreen.java | 23 ++-- .../impl/client/gui/ContainerScreenOverlay.java | 12 +- .../rei/impl/client/gui/RecipeDisplayExporter.java | 30 ++--- .../gui/modules/entries/GameModeMenuEntry.java | 2 +- .../gui/modules/entries/SubSubsetsMenuEntry.java | 4 +- .../gui/screen/CompositeDisplayViewingScreen.java | 4 +- .../gui/screen/DefaultDisplayViewingScreen.java | 2 +- .../SearchFilterSyntaxHighlightingScreen.java | 11 +- .../impl/client/gui/screen/TransformingScreen.java | 24 ++-- .../gui/screen/UncertainDisplayViewingScreen.java | 3 +- .../gui/toast/CopyRecipeIdentifierToast.java | 4 +- .../gui/toast/ExportRecipeIdentifierToast.java | 4 +- .../gui/widget/BatchEntryRendererManager.java | 143 -------------------- .../gui/widget/BatchedEntryRendererManager.java | 144 +++++++++++++++++++++ .../widget/DynamicErrorFreeEntryListWidget.java | 50 +++---- .../client/gui/widget/EntryListEntryWidget.java | 2 +- .../impl/client/gui/widget/EntryListWidget.java | 10 +- .../rei/impl/client/gui/widget/EntryWidget.java | 2 +- .../client/gui/widget/FavoritesListWidget.java | 2 +- .../rei/impl/client/gui/widget/TabWidget.java | 3 +- .../client/gui/widget/basewidgets/ArrowWidget.java | 4 +- .../gui/widget/basewidgets/BurningFireWidget.java | 3 +- .../gui/widget/basewidgets/ButtonWidget.java | 4 +- .../basewidgets/FillRectangleDrawableConsumer.java | 11 +- .../client/gui/widget/basewidgets/PanelWidget.java | 4 +- .../gui/widget/basewidgets/TextFieldWidget.java | 11 +- .../basewidgets/TexturedDrawableConsumer.java | 5 +- .../OverlaySearchFieldSyntaxHighlighter.java | 4 +- .../shedaniel/rei/impl/client/search/IntRange.java | 38 ++++++ .../rei/impl/client/search/argument/Argument.java | 2 +- .../search/result/ArgumentApplicableResult.java | 2 +- .../rei/impl/common/compat/LBASupportPlugin.java | 4 +- .../rei/impl/common/entry/AbstractEntryStack.java | 2 +- .../rei/impl/common/transfer/InputSlotCrafter.java | 3 - .../plugin/client/DefaultClientRuntimePlugin.java | 15 ++- .../plugin/client/entry/FluidEntryDefinition.java | 10 +- .../plugin/client/entry/ItemEntryDefinition.java | 54 ++++---- 41 files changed, 361 insertions(+), 347 deletions(-) delete mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchEntryRendererManager.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/search/IntRange.java (limited to 'runtime/src') diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java index 0e79ca8f6..46f02a5a8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java @@ -25,6 +25,7 @@ package me.shedaniel.rei; import io.netty.buffer.Unpooled; import me.shedaniel.architectury.networking.NetworkManager; +import me.shedaniel.rei.api.client.REIHelper; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.impl.common.transfer.InputSlotCrafter; @@ -57,9 +58,10 @@ public class RoughlyEnoughItemsNetwork { player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); return; } - if (!player.inventory.getCarried().isEmpty()) { - player.inventory.setCarried(ItemStack.EMPTY); - player.broadcastCarriedItem(); + AbstractContainerMenu menu = player.containerMenu; + if (!menu.getCarried().isEmpty()) { + menu.setCarried(ItemStack.EMPTY); + menu.broadcastChanges(); } }); NetworkManager.registerReceiver(NetworkManager.c2s(), CREATE_ITEMS_PACKET, (buf, context) -> { @@ -69,7 +71,7 @@ public class RoughlyEnoughItemsNetwork { return; } ItemStack stack = buf.readItem(); - if (player.inventory.add(stack.copy())) { + if (player.getInventory().add(stack.copy())) { NetworkManager.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.copy()).writeUtf(player.getScoreboardName(), 32767)); } else { player.displayClientMessage(new TranslatableComponent("text.rei.failed_cheat_items"), false); @@ -82,16 +84,16 @@ public class RoughlyEnoughItemsNetwork { return; } - Inventory inventory = player.inventory; + AbstractContainerMenu menu = player.containerMenu; ItemStack itemStack = buf.readItem(); ItemStack stack = itemStack.copy(); - if (!inventory.getCarried().isEmpty() && ItemStack.isSameIgnoreDurability(inventory.getCarried(), stack) && ItemStack.tagMatches(inventory.getCarried(), stack)) { - stack.setCount(Mth.clamp(stack.getCount() + inventory.getCarried().getCount(), 1, stack.getMaxStackSize())); - } else if (!inventory.getCarried().isEmpty()) { + if (!menu.getCarried().isEmpty() && ItemStack.isSameIgnoreDurability(menu.getCarried(), stack) && ItemStack.tagMatches(menu.getCarried(), stack)) { + stack.setCount(Mth.clamp(stack.getCount() + menu.getCarried().getCount(), 1, stack.getMaxStackSize())); + } else if (!menu.getCarried().isEmpty()) { return; } - inventory.setCarried(stack.copy()); - player.broadcastCarriedItem(); + menu.setCarried(stack.copy()); + menu.broadcastChanges(); NetworkManager.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(itemStack.copy()).writeUtf(player.getScoreboardName(), 32767)); }); NetworkManager.registerReceiver(NetworkManager.c2s(), MOVE_ITEMS_PACKET, (packetByteBuf, context) -> { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java index 9ae8da79e..bd2940d4d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java @@ -56,14 +56,13 @@ import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.LazyLoadedValue; import net.minecraft.util.Mth; -import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.time.LocalDateTime; import java.util.*; -import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -103,7 +102,7 @@ public class ClientHelperImpl implements ClientHelper { return (ClientHelperImpl) ClientHelper.getInstance(); } - public boolean hasPermissionToUsePackets() { + public boolean hasPermissionToUsePackets() { try { Minecraft.getInstance().getConnection().getSuggestionsProvider().hasPermission(0); return hasOperatorPermission() && canUsePackets(); @@ -157,7 +156,7 @@ public class ClientHelperImpl implements ClientHelper { @Override public void sendDeletePacket() { if (Minecraft.getInstance().screen instanceof CreativeModeInventoryScreen) { - Minecraft.getInstance().player.inventory.setCarried(ItemStack.EMPTY); + Minecraft.getInstance().player.containerMenu.setCarried(ItemStack.EMPTY); ((CreativeModeInventoryScreen) Minecraft.getInstance().screen).isQuickCrafting = false; return; } @@ -173,22 +172,22 @@ public class ClientHelperImpl implements ClientHelper { return false; EntryStack entry = (EntryStack) e; if (Minecraft.getInstance().player == null) return false; - if (Minecraft.getInstance().player.inventory == null) return false; + if (Minecraft.getInstance().player.getInventory() == null) return false; ItemStack cheatedStack = entry.getValue().copy(); if (ConfigObject.getInstance().isGrabbingItems() && Minecraft.getInstance().screen instanceof CreativeModeInventoryScreen) { - Inventory inventory = Minecraft.getInstance().player.inventory; + AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; EntryStack stack = entry.copy(); - if (!inventory.getCarried().isEmpty() && EntryStacks.equalsExact(EntryStacks.of(inventory.getCarried()), stack)) { - stack.getValue().setCount(Mth.clamp(stack.getValue().getCount() + inventory.getCarried().getCount(), 1, stack.getValue().getMaxStackSize())); - } else if (!inventory.getCarried().isEmpty()) { + if (!menu.getCarried().isEmpty() && EntryStacks.equalsExact(EntryStacks.of(menu.getCarried()), stack)) { + stack.getValue().setCount(Mth.clamp(stack.getValue().getCount() + menu.getCarried().getCount(), 1, stack.getValue().getMaxStackSize())); + } else if (!menu.getCarried().isEmpty()) { return false; } - inventory.setCarried(stack.getValue().copy()); + menu.setCarried(stack.getValue().copy()); return true; } else if (ClientHelperImpl.getInstance().canUsePackets()) { - Inventory inventory = Minecraft.getInstance().player.inventory; + AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; EntryStack stack = entry.copy(); - if (!inventory.getCarried().isEmpty() && !EntryStacks.equalsExact(EntryStacks.of(inventory.getCarried()), stack)) { + if (!menu.getCarried().isEmpty() && !EntryStacks.equalsExact(EntryStacks.of(menu.getCarried()), stack)) { return false; } try { @@ -216,7 +215,7 @@ public class ClientHelperImpl implements ClientHelper { @ApiStatus.Internal public Set> _getInventoryItemsTypes() { - return Minecraft.getInstance().player.inventory.compartments.stream() + return Minecraft.getInstance().player.getInventory().compartments.stream() .flatMap(Collection::stream) .map(EntryStacks::of) .collect(Collectors.toSet()); @@ -421,7 +420,7 @@ public class ClientHelperImpl implements ClientHelper { this.preferredOpenedCategory = category; return this; } - + @Override @Nullable public CategoryIdentifier getPreferredOpenedCategory() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java index e9c899a95..56bfb9fa9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java @@ -47,6 +47,7 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java index 149a8f929..5918a373c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.client.config.entries; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget; import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule; @@ -191,7 +192,7 @@ public class FilteringRulesScreen extends Screen { @Override protected void renderBg(PoseStack matrices, Minecraft client, int mouseX, int mouseY) { super.renderBg(matrices, client, mouseX, mouseY); - Minecraft.getInstance().getTextureManager().bind(CHEST_GUI_TEXTURE); + RenderSystem.setShaderTexture(0, CHEST_GUI_TEXTURE); blit(matrices, x + 3, y + 3, 0, 0, 14, 14); } }; 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 7a6e9f32d..89a54e403 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 @@ -26,10 +26,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.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.*; import com.mojang.math.Matrix4f; import me.shedaniel.clothconfig2.ClothConfigInitializer; import me.shedaniel.clothconfig2.api.ScissorsHandler; @@ -46,13 +43,14 @@ 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.BatchedEntryRendererManager; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; @@ -196,11 +194,12 @@ public class FilteringScreen extends Screen { protected void renderHoleBackground(PoseStack matrices, int y1, int y2, int tint, int alpha1, int alpha2) { Tesselator tesselator = Tesselator.getInstance(); BufferBuilder buffer = tesselator.getBuilder(); - this.minecraft.getTextureManager().bind(BACKGROUND_LOCATION); + RenderSystem.setShaderTexture(0, BACKGROUND_LOCATION); Matrix4f matrix = matrices.last().pose(); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); float float_1 = 32.0F; - buffer.begin(7, DefaultVertexFormat.POSITION_TEX_COLOR); + RenderSystem.setShader(GameRenderer::getPositionTexColorShader); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); buffer.vertex(matrix, 0, y2, 0.0F).uv(0.0F, y2 / 32.0F).color(tint, tint, tint, alpha2).endVertex(); buffer.vertex(matrix, this.width, y2, 0.0F).uv(this.width / 32.0F, y2 / 32.0F).color(tint, tint, tint, alpha2).endVertex(); buffer.vertex(matrix, this.width, y1, 0.0F).uv(this.width / 32.0F, y1 / 32.0F).color(tint, tint, tint, alpha1).endVertex(); @@ -222,7 +221,7 @@ 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(); + BatchedEntryRendererManager manager = new BatchedEntryRendererManager(); for (; i < entryStacks.size(); i++) { EntryStack stack = entryStacks.get(i); EntryListEntry entry = entries.get(nextIndex); @@ -250,19 +249,15 @@ public class FilteringScreen extends Screen { BufferBuilder buffer = tesselator.getBuilder(); RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(770, 771, 0, 1); - RenderSystem.disableAlphaTest(); - RenderSystem.shadeModel(7425); RenderSystem.disableTexture(); Matrix4f matrix = matrices.last().pose(); - buffer.begin(7, DefaultVertexFormat.POSITION_TEX_COLOR); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); buffer.vertex(matrix, 0, bounds.y + 4, 0.0F).uv(0.0F, 1.0F).color(0, 0, 0, 0).endVertex(); 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(); tesselator.end(); RenderSystem.enableTexture(); - RenderSystem.shadeModel(7424); - RenderSystem.enableAlphaTest(); RenderSystem.disableBlend(); renderHoleBackground(matrices, 0, bounds.y, 64, 255, 255); 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 8abd4ea35..f8ffd2a01 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 @@ -209,7 +209,7 @@ public class ContainerScreenOverlay extends REIOverlay { } public void init() { - draggingStack.set(DraggableStackProvider.from(() -> ScreenRegistry.getInstance().getDraggableProviders()), + draggingStack.set(DraggableStackProvider.from(() -> ScreenRegistry.getInstance().getDraggableProviders()), DraggableStackVisitor.from(() -> ScreenRegistry.getInstance().getDraggableVisitors())); this.shouldReload = false; @@ -252,7 +252,7 @@ public class ContainerScreenOverlay extends REIOverlay { .tooltipLine(new TranslatableComponent("text.rei.next_page")) .focusable(false)); } - + final Rectangle configButtonArea = getConfigButtonArea(); widgets.add(configButton = InternalWidgets.wrapLateRenderable( Widgets.withTranslate( @@ -292,7 +292,7 @@ public class ContainerScreenOverlay extends REIOverlay { }), Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { helper.setBlitOffset(helper.getBlitOffset() + 1); - Minecraft.getInstance().getTextureManager().bind(CHEST_GUI_TEXTURE); + RenderSystem.setShaderTexture(0, CHEST_GUI_TEXTURE); helper.blit(matrices, configButtonArea.x + 3, configButtonArea.y + 3, 0, 0, 14, 14); }) ), @@ -345,8 +345,8 @@ public class ContainerScreenOverlay extends REIOverlay { .focusable(false) .containsMousePredicate((button, point) -> button.getBounds().contains(point) && isNotInExclusionZones(point.x, point.y))); widgets.add(Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { - Minecraft.getInstance().getTextureManager().bind(CHEST_GUI_TEXTURE); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.setShaderTexture(0, CHEST_GUI_TEXTURE); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); helper.blit(matrices, weatherButton.getBounds().x + 3, weatherButton.getBounds().y + 3, getCurrentWeather().getId() * 14, 14, 14, 14); })); } @@ -533,7 +533,7 @@ public class ContainerScreenOverlay extends REIOverlay { } matrices.popPose(); } - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); this.renderWidgets(matrices, mouseX, mouseY, delta); if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { Screen screen = Minecraft.getInstance().screen; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/RecipeDisplayExporter.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/RecipeDisplayExporter.java index a47ad56c3..df4b72d32 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/RecipeDisplayExporter.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/RecipeDisplayExporter.java @@ -29,6 +29,7 @@ import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.impl.client.gui.toast.ExportRecipeIdentifierToast; @@ -70,30 +71,26 @@ public final class RecipeDisplayExporter extends Widget { } } - @SuppressWarnings("deprecation") private void exportRecipe(Rectangle rectangle, List widgets) { - RenderSystem.pushMatrix(); Minecraft client = Minecraft.getInstance(); Window window = client.getWindow(); - RenderTarget framebuffer = new RenderTarget(window.getWidth(), window.getHeight(), true, false); - framebuffer.bindWrite(true); - RenderSystem.viewport(0, 0, window.getWidth(), window.getHeight()); + RenderTarget renderTarget = new RenderTarget(window.getWidth(), window.getHeight(), true, false); + renderTarget.bindWrite(true); RenderSystem.clear(256, Minecraft.ON_OSX); - RenderSystem.matrixMode(5889); - RenderSystem.loadIdentity(); - RenderSystem.ortho(0.0D, (double) window.getWidth() / window.getGuiScale(), (double) window.getHeight() / window.getGuiScale(), 0.0D, 1000.0D, 3000.0D); - RenderSystem.matrixMode(5888); - RenderSystem.loadIdentity(); - RenderSystem.translatef(0.0F, 0.0F, -2000.0F); + Matrix4f matrix4f = Matrix4f.orthographic(0.0F, (float) ((double) window.getWidth() / window.getGuiScale()), 0.0F, (float) ((double) window.getHeight() / window.getGuiScale()), 1000.0F, 3000.0F); + RenderSystem.setProjectionMatrix(matrix4f); + PoseStack poseStack = RenderSystem.getModelViewStack(); + poseStack.setIdentity(); + poseStack.translate(0.0D, 0.0D, -2000.0D); + RenderSystem.applyModelViewMatrix(); Lighting.setupFor3DItems(); PoseStack matrices = new PoseStack(); for (Widget widget : widgets) { widget.render(matrices, -1, -1, 0); } - RenderSystem.popMatrix(); - NativeImage nativeImage = new NativeImage(framebuffer.width, framebuffer.height, false); - RenderSystem.bindTexture(framebuffer.getColorTextureId()); + NativeImage nativeImage = new NativeImage(renderTarget.width, renderTarget.height, false); + RenderSystem.bindTexture(renderTarget.getColorTextureId()); nativeImage.downloadTexture(0, false); nativeImage.flipY(); int outWidth = (int) (rectangle.width * window.getGuiScale()); @@ -114,9 +111,12 @@ public final class RecipeDisplayExporter extends Widget { } finally { nativeImage.close(); strippedImage.close(); - RenderSystem.recordRenderCall(framebuffer::destroyBuffers); } }); + + renderTarget.destroyBuffers(); + Minecraft.getInstance().levelRenderer.graphicsChanged(); + Minecraft.getInstance().getMainRenderTarget().bindWrite(true); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/GameModeMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/GameModeMenuEntry.java index b1d3fe704..db2eeb672 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/GameModeMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/GameModeMenuEntry.java @@ -47,7 +47,7 @@ public class GameModeMenuEntry extends MenuEntry { private int textWidth = -69; public GameModeMenuEntry(GameType gameMode) { - this.text = gameMode.getDisplayName().getString(); + this.text = gameMode.getLongDisplayName().getString(); this.gameMode = gameMode; } 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 36c3426b6..e1573ebf1 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 @@ -24,6 +24,7 @@ package me.shedaniel.rei.impl.client.gui.modules.entries; import com.google.common.collect.Lists; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.api.ScissorsHandler; import me.shedaniel.math.Point; @@ -40,7 +41,6 @@ import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; import me.shedaniel.rei.impl.client.gui.modules.Menu; import me.shedaniel.rei.impl.client.gui.modules.MenuEntry; import me.shedaniel.rei.impl.client.gui.widget.TabWidget; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.TextComponent; @@ -142,7 +142,7 @@ public class SubSubsetsMenuEntry extends MenuEntry { } else clickedBefore = false; font.draw(matrices, text, x + 2, y + 2, selected ? 16777215 : 8947848); if (!entries.isEmpty()) { - Minecraft.getInstance().getTextureManager().bind(TabWidget.CHEST_GUI_TEXTURE); + RenderSystem.setShaderTexture(0, TabWidget.CHEST_GUI_TEXTURE); blit(matrices, x + width - 15, y - 2, 0, 28, 18, 18); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java index 6214c0254..746379c93 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java @@ -334,7 +334,7 @@ public class CompositeDisplayViewingScreen extends AbstractDisplayViewingScreen widget.render(matrices, mouseX, mouseY, delta); } super.render(matrices, mouseX, mouseY, delta); - RenderSystem.pushMatrix(); + matrices.pushPose(); ScissorsHandler.INSTANCE.scissor(scrolling.getBounds()); for (Button button : buttonList) { button.getBounds().y = scrollListBounds.y + 1 + yOffset - (int) scrolling.scrollAmount; @@ -352,7 +352,7 @@ public class CompositeDisplayViewingScreen extends AbstractDisplayViewingScreen } scrolling.renderScrollBar(0, scrollBarAlpha, REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); ScissorsHandler.INSTANCE.removeLastScissor(); - RenderSystem.popMatrix(); + matrices.popPose(); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java index 85cb85994..e44baaaaa 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java @@ -345,7 +345,7 @@ public class DefaultDisplayViewingScreen extends AbstractDisplayViewingScreen { for (Widget widget : widgets) { widget.render(matrices, mouseX, mouseY, delta); } - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); for (TabWidget tab : tabs) { if (tab.isSelected()) tab.render(matrices, mouseX, mouseY, delta); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/SearchFilterSyntaxHighlightingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/SearchFilterSyntaxHighlightingScreen.java index 8361f950f..7b6eb6c1f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/SearchFilterSyntaxHighlightingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/SearchFilterSyntaxHighlightingScreen.java @@ -24,10 +24,7 @@ package me.shedaniel.rei.impl.client.gui.screen; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.*; import com.mojang.math.Matrix4f; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; @@ -50,11 +47,11 @@ public class SearchFilterSyntaxHighlightingScreen extends Screen { protected void renderHoleBackground(PoseStack matrices, int y1, int y2, int tint, int alpha1, int alpha2) { Tesselator tesselator = Tesselator.getInstance(); BufferBuilder buffer = tesselator.getBuilder(); - this.minecraft.getTextureManager().bind(BACKGROUND_LOCATION); + RenderSystem.setShaderTexture(0, BACKGROUND_LOCATION); Matrix4f matrix = matrices.last().pose(); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); float float_1 = 32.0F; - buffer.begin(7, DefaultVertexFormat.POSITION_TEX_COLOR); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); buffer.vertex(matrix, 0, y2, 0.0F).uv(0.0F, y2 / 32.0F).color(tint, tint, tint, alpha2).endVertex(); buffer.vertex(matrix, this.width, y2, 0.0F).uv(this.width / 32.0F, y2 / 32.0F).color(tint, tint, tint, alpha2).endVertex(); buffer.vertex(matrix, this.width, y1, 0.0F).uv(this.width / 32.0F, y1 / 32.0F).color(tint, tint, tint, alpha1).endVertex(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/TransformingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/TransformingScreen.java index ee37c6305..a9402cba6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/TransformingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/TransformingScreen.java @@ -96,27 +96,27 @@ public class TransformingScreen extends DelegateScreen implements ScissorsScreen if (!translatingLast) { renderingLastScreen = true; if (lastScreen != null) { - RenderSystem.pushMatrix(); - RenderSystem.translated(0, 0, -400); + poseStack.pushPose(); + poseStack.translate(0, 0, -400); lastScreen.render(poseStack, -1, -1, 0); - RenderSystem.popMatrix(); + poseStack.popPose(); } renderingLastScreen = false; - RenderSystem.pushMatrix(); - RenderSystem.translated(xTransformer.getAsDouble(), yTransformer.getAsDouble(), 0); + poseStack.pushPose(); + poseStack.translate(xTransformer.getAsDouble(), yTransformer.getAsDouble(), 0); super.render(poseStack, i, j, f); - RenderSystem.popMatrix(); + poseStack.popPose(); } else { - RenderSystem.pushMatrix(); - RenderSystem.translated(0, 0, -400); + poseStack.pushPose(); + poseStack.translate(0, 0, -400); super.render(poseStack, i, j, f); - RenderSystem.popMatrix(); + poseStack.popPose(); renderingLastScreen = true; if (lastScreen != null) { - RenderSystem.pushMatrix(); - RenderSystem.translated(xTransformer.getAsDouble(), yTransformer.getAsDouble(), 0); + poseStack.pushPose(); + poseStack.translate(xTransformer.getAsDouble(), yTransformer.getAsDouble(), 0); lastScreen.render(poseStack, -1, -1, 0); - RenderSystem.popMatrix(); + poseStack.popPose(); } renderingLastScreen = false; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java index b5f0607f8..984f4dc9e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java @@ -24,6 +24,7 @@ package me.shedaniel.rei.impl.client.gui.screen; import com.google.common.collect.Lists; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix4f; import it.unimi.dsi.fastutil.booleans.BooleanConsumer; @@ -274,7 +275,7 @@ public class UncertainDisplayViewingScreen extends Screen { @Override public void render(PoseStack matrices, int i, int i1, float delta) { - Minecraft.getInstance().getTextureManager().bind(type == DisplayScreenType.ORIGINAL ? DEFAULT : COMPOSITE); + RenderSystem.setShaderTexture(0, type == DisplayScreenType.ORIGINAL ? DEFAULT : COMPOSITE); blit(matrices, bounds.x + (type == DisplayScreenType.ORIGINAL ? 8 : 4), bounds.y + 4, bounds.width - 8, bounds.height - 8, 113, type == DisplayScreenType.ORIGINAL ? 16 : 27, 854 - 113 * 2, 480 - 27 * 2, 854, 480); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/CopyRecipeIdentifierToast.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/CopyRecipeIdentifierToast.java index 8e72d05e7..3f4587c75 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/CopyRecipeIdentifierToast.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/CopyRecipeIdentifierToast.java @@ -51,8 +51,8 @@ public class CopyRecipeIdentifierToast implements Toast { @Override public Visibility render(PoseStack matrices, ToastComponent toastManager, long var2) { - toastManager.getMinecraft().getTextureManager().bind(TEXTURE); - RenderSystem.color3f(1.0F, 1.0F, 1.0F); + RenderSystem.setShaderTexture(0, TEXTURE); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); toastManager.blit(matrices, 0, 0, 0, 0, 160, 32); if (this.subtitle == null) { toastManager.getMinecraft().font.draw(matrices, this.title, 18.0F, 12.0F, 11141120); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/ExportRecipeIdentifierToast.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/ExportRecipeIdentifierToast.java index 280744bfe..a45147d86 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/ExportRecipeIdentifierToast.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/ExportRecipeIdentifierToast.java @@ -51,8 +51,8 @@ public class ExportRecipeIdentifierToast implements Toast { @Override public Visibility render(PoseStack matrices, ToastComponent toastManager, long var2) { - toastManager.getMinecraft().getTextureManager().bind(TEXTURE); - RenderSystem.color3f(1.0F, 1.0F, 1.0F); + RenderSystem.setShaderTexture(0, TEXTURE); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); toastManager.blit(matrices, 0, 0, 0, 0, 160, 32); if (this.subtitle == null) { toastManager.getMinecraft().font.draw(matrices, this.title, 18.0F, 12.0F, 11141120); 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 deleted file mode 100644 index 6cafecb90..000000000 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchEntryRendererManager.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * 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> grouping = new Int2ObjectOpenHashMap<>(); - private List toRender = new ArrayList<>(); - - public BatchEntryRendererManager() { - } - - public BatchEntryRendererManager(Collection widgets) { - addAll(widgets); - } - - public void addAll(Collection 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) renderer).getBatchId(currentEntry.cast()); - List 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 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 void renderEntries(boolean debugTime, MutableInt size, MutableLong time, boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable 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/BatchedEntryRendererManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java new file mode 100644 index 000000000..a410a24a3 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java @@ -0,0 +1,144 @@ +/* + * 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.BatchedEntryRenderer; +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 BatchedEntryRendererManager { + private boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); + private Int2ObjectMap> grouping = new Int2ObjectOpenHashMap<>(); + private List toRender = new ArrayList<>(); + + public BatchedEntryRendererManager() { + } + + public BatchedEntryRendererManager(Collection widgets) { + addAll(widgets); + } + + public void addAll(Collection 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 BatchedEntryRenderer) { + int hash = ((BatchedEntryRenderer) renderer).getBatchIdentifier(currentEntry.cast(), widget.getBounds()); + List 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 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 void renderEntries(boolean debugTime, MutableInt size, MutableLong time, boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable 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 BatchedEntryRenderer) { + BatchedEntryRenderer firstRenderer = (BatchedEntryRenderer) renderer; + matrices = firstRenderer.batchModifyMatrices(matrices); + 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/DynamicErrorFreeEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DynamicErrorFreeEntryListWidget.java index 1b25d6595..c042b7d1a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DynamicErrorFreeEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DynamicErrorFreeEntryListWidget.java @@ -24,12 +24,8 @@ package me.shedaniel.rei.impl.client.gui.widget; import com.google.common.collect.Lists; -import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.*; import com.mojang.math.Matrix4f; import me.shedaniel.rei.api.client.gui.AbstractContainerEventHandler; import net.fabricmc.api.EnvType; @@ -189,11 +185,11 @@ public abstract class DynamicErrorFreeEntryListWidget 0) { int int_9 = ((this.bottom - this.top) * (this.bottom - this.top)) / this.getMaxScrollPosition(); @@ -259,19 +247,19 @@ public abstract class DynamicErrorFreeEntryListWidget