shedaniel %!s(int64=5) %!d(string=hai) anos
pai
achega
f9a8e643a9
Modificáronse 34 ficheiros con 317 adicións e 197 borrados
  1. 2 1
      build.gradle
  2. 2 2
      gradle.properties
  3. 8 8
      src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
  4. 4 0
      src/main/java/me/shedaniel/rei/api/ConfigObject.java
  5. 13 0
      src/main/java/me/shedaniel/rei/api/ItemRendererHooks.java
  6. 5 1
      src/main/java/me/shedaniel/rei/api/ItemStackHook.java
  7. 15 21
      src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
  8. 0 2
      src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java
  9. 3 5
      src/main/java/me/shedaniel/rei/gui/PreRecipeViewingScreen.java
  10. 4 10
      src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java
  11. 2 8
      src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java
  12. 1 3
      src/main/java/me/shedaniel/rei/gui/entries/SimpleRecipeEntry.java
  13. 0 3
      src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java
  14. 147 54
      src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
  15. 0 2
      src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java
  16. 0 2
      src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java
  17. 0 2
      src/main/java/me/shedaniel/rei/gui/widget/PanelWidget.java
  18. 0 4
      src/main/java/me/shedaniel/rei/gui/widget/RecipeArrowWidget.java
  19. 4 6
      src/main/java/me/shedaniel/rei/gui/widget/RecipeChoosePageWidget.java
  20. 0 4
      src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java
  21. 12 0
      src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java
  22. 0 2
      src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java
  23. 58 15
      src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java
  24. 21 0
      src/main/java/me/shedaniel/rei/mixin/MixinItemRenderer.java
  25. 2 2
      src/main/java/me/shedaniel/rei/mixin/MixinItemStack.java
  26. 2 6
      src/main/java/me/shedaniel/rei/plugin/brewing/DefaultBrewingCategory.java
  27. 2 6
      src/main/java/me/shedaniel/rei/plugin/campfire/DefaultCampfireCategory.java
  28. 0 4
      src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java
  29. 1 5
      src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingCategory.java
  30. 2 6
      src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingCategory.java
  31. 2 6
      src/main/java/me/shedaniel/rei/plugin/stonecutting/DefaultStoneCuttingCategory.java
  32. 2 6
      src/main/java/me/shedaniel/rei/plugin/stripping/DefaultStrippingCategory.java
  33. 1 0
      src/main/resources/assets/roughlyenoughitems/lang/en_us.json
  34. 2 1
      src/main/resources/mixin.roughlyenoughitems.json

+ 2 - 1
build.gradle

@@ -105,6 +105,7 @@ curseforge {
             changelogType = "html"
             changelog = "<a href=\"https://gist.github.com/shedaniel/b7593e692319976f3349263208792922\">Click here for changelog</a>"
             addGameVersion '1.15'
+            addGameVersion '1.15.1'
             addGameVersion '1.15-Snapshot'
             addGameVersion 'Java 8'
             relations {
@@ -113,7 +114,7 @@ curseforge {
                 embeddedLibrary 'cloth-config'
             }
             mainArtifact(file("${project.buildDir}/libs/${project.archivesBaseName}-${project.version}.jar")) {
-                displayName = "[Fabric ${project.minecraft_version}] v$project.version"
+                displayName = "[Fabric 1.15.x] v$project.version"
             }
             afterEvaluate {
                 uploadTask.dependsOn("remapJar")

+ 2 - 2
gradle.properties

@@ -1,8 +1,8 @@
-mod_version=3.2.27
+mod_version=3.2.28
 minecraft_version=1.15
 yarn_version=1.15+build.1
 fabricloader_version=0.7.2+build.174
-cloth_events_version=1.0.1-unstable.201911010702
+cloth_events_version=1.1.0
 cloth_config_version=2.5.3
 modmenu_version=1.8.0+build.16
 fabric_api=0.4.20+build.273-1.15

+ 8 - 8
src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java

@@ -109,7 +109,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
     }
     
     public static Optional<Identifier> getPluginIdentifier(REIPluginEntry plugin) {
-        for (Identifier identifier : plugins.keySet())
+        for(Identifier identifier : plugins.keySet())
             if (identifier != null && plugins.get(identifier).equals(plugin))
                 return Optional.of(identifier);
         return Optional.empty();
@@ -161,7 +161,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
         
         registerClothEvents();
         discoverPluginEntries();
-        for (ModContainer modContainer : FabricLoader.getInstance().getAllMods()) {
+        for(ModContainer modContainer : FabricLoader.getInstance().getAllMods()) {
             if (modContainer.getMetadata().containsCustomValue("roughlyenoughitems:plugins"))
                 RoughlyEnoughItemsCore.LOGGER.error("[REI] REI plugin from " + modContainer.getMetadata().getId() + " is not loaded because it is too old!");
         }
@@ -180,10 +180,10 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
                 
                 List<List<ItemStack>> input = Lists.newArrayList();
                 int mapSize = packetByteBuf.readInt();
-                for (int i = 0; i < mapSize; i++) {
+                for(int i = 0; i < mapSize; i++) {
                     List<ItemStack> list = Lists.newArrayList();
                     int count = packetByteBuf.readInt();
-                    for (int j = 0; j < count; j++) {
+                    for(int j = 0; j < count; j++) {
                         list.add(packetByteBuf.readItemStack());
                     }
                     input.add(list);
@@ -191,7 +191,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
                 
                 ghostSlots.addSlot(Ingredient.ofItems(Items.STONE), 381203812, 12738291);
                 CraftingTableContainer container = ((CraftingTableScreen) currentScreen).getContainer();
-                for (int i = 0; i < input.size(); i++) {
+                for(int i = 0; i < input.size(); i++) {
                     List<ItemStack> stacks = input.get(i);
                     if (!stacks.isEmpty()) {
                         Slot slot = container.getSlot(i + container.getCraftingResultSlotIndex() + 1);
@@ -204,7 +204,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
     
     @SuppressWarnings("deprecation")
     private void discoverPluginEntries() {
-        for (REIPluginEntry reiPlugin : FabricLoader.getInstance().getEntrypoints("rei_plugins", REIPluginEntry.class)) {
+        for(REIPluginEntry reiPlugin : FabricLoader.getInstance().getEntrypoints("rei_plugins", REIPluginEntry.class)) {
             try {
                 if (!REIPluginV0.class.isAssignableFrom(reiPlugin.getClass()))
                     throw new IllegalArgumentException("REI plugin is too old!");
@@ -214,7 +214,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
                 RoughlyEnoughItemsCore.LOGGER.error("[REI] Can't load REI plugins from %s: %s", reiPlugin.getClass(), e.getLocalizedMessage());
             }
         }
-        for (REIPluginV0 reiPlugin : FabricLoader.getInstance().getEntrypoints("rei_plugins_v0", REIPluginV0.class)) {
+        for(REIPluginV0 reiPlugin : FabricLoader.getInstance().getEntrypoints("rei_plugins_v0", REIPluginV0.class)) {
             try {
                 registerPlugin(reiPlugin);
             } catch (Exception e) {
@@ -251,7 +251,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
                     return;
                 ScreenHelper.setLastContainerScreen((AbstractContainerScreen<?>) screen);
                 boolean alreadyAdded = false;
-                for (Element element : Lists.newArrayList(screenHooks.cloth_getInputListeners()))
+                for(Element element : Lists.newArrayList(screenHooks.cloth_getInputListeners()))
                     if (ContainerScreenOverlay.class.isAssignableFrom(element.getClass()))
                         if (alreadyAdded)
                             screenHooks.cloth_getInputListeners().remove(element);

+ 4 - 0
src/main/java/me/shedaniel/rei/api/ConfigObject.java

@@ -98,6 +98,10 @@ public interface ConfigObject {
     
     boolean doDisplayFavoritesOnTheLeft();
     
+    boolean doesFastEntryRendering();
+    
+    boolean doDebugRenderTimeRequired();
+    
     InputUtil.KeyCode getFavoriteKeybind();
     
     @Retention(RetentionPolicy.RUNTIME)

+ 13 - 0
src/main/java/me/shedaniel/rei/api/ItemRendererHooks.java

@@ -0,0 +1,13 @@
+package me.shedaniel.rei.api;
+
+import me.shedaniel.rei.api.annotations.Internal;
+import net.minecraft.client.render.VertexConsumer;
+import net.minecraft.client.render.model.BakedModel;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.item.ItemStack;
+
+@Internal
+@Deprecated
+public interface ItemRendererHooks {
+    void rei_renderBakedItemModel(BakedModel model, ItemStack stack, int light, int overlay, MatrixStack matrices, VertexConsumer vertices);
+}

+ 5 - 1
src/main/java/me/shedaniel/rei/api/ItemStackRenderOverlayHook.java → src/main/java/me/shedaniel/rei/api/ItemStackHook.java

@@ -5,6 +5,10 @@
 
 package me.shedaniel.rei.api;
 
-public interface ItemStackRenderOverlayHook {
+import me.shedaniel.rei.api.annotations.Internal;
+
+@Internal
+@Deprecated
+public interface ItemStackHook {
     void rei_setRenderEnchantmentGlint(boolean b);
 }

+ 15 - 21
src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java

@@ -22,7 +22,6 @@ import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.render.Tessellator;
 import net.minecraft.client.render.VertexConsumerProvider;
 import net.minecraft.client.resource.language.I18n;
@@ -71,7 +70,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
         VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer());
         matrixStack_1.translate(0.0D, 0.0D, getBlitOffset());
         Matrix4f matrix4f_1 = matrixStack_1.peek().getModel();
-        for (int lineIndex = 0; lineIndex < tooltipLines.size(); lineIndex++) {
+        for(int lineIndex = 0; lineIndex < tooltipLines.size(); lineIndex++) {
             font.draw(tooltipLines.get(lineIndex), x, currentY, -1, true, matrix4f_1, immediate, false, 0, 15728880);
             currentY += lineIndex == 0 ? 12 : 10;
         }
@@ -186,7 +185,6 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
             @Override
             public void render(int mouseX, int mouseY, float delta) {
                 super.render(mouseX, mouseY, delta);
-                DiffuseLighting.disable();
                 Rectangle bounds = getBounds();
                 if (ClientHelper.getInstance().isCheating() && RoughlyEnoughItemsCore.hasOperatorPermission()) {
                     if (RoughlyEnoughItemsCore.hasPermissionToUsePackets())
@@ -253,7 +251,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
                 }
             });
             int xxx = ConfigObject.getInstance().isLeftHandSidePanel() ? window.getScaledWidth() - 30 : 10;
-            for (Weather weather : Weather.values()) {
+            for(Weather weather : Weather.values()) {
                 widgets.add(new ButtonWidget(new Rectangle(xxx, 35, 20, 20), "") {
                     @Override
                     public void onPressed() {
@@ -263,7 +261,6 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
                     @Override
                     public void render(int mouseX, int mouseY, float delta) {
                         super.render(mouseX, mouseY, delta);
-                        DiffuseLighting.disable();
                         MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
                         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                         blit(getBounds().x + 3, getBounds().y + 3, weather.getId() * 14, 14, 14, 14);
@@ -427,7 +424,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
         if (shouldReInit)
             init();
         else {
-            for (DisplayHelper.DisplayBoundsHandler<?> handler : DisplayHelper.getInstance().getSortedBoundsHandlers(minecraft.currentScreen.getClass())) {
+            for(DisplayHelper.DisplayBoundsHandler<?> handler : DisplayHelper.getInstance().getSortedBoundsHandlers(minecraft.currentScreen.getClass())) {
                 if (handler != null && handler.shouldRecalculateArea(!ConfigObject.getInstance().isLeftHandSidePanel(), rectangle)) {
                     init();
                     break;
@@ -439,23 +436,21 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
             ENTRY_LIST_WIDGET.updateSearch(ScreenHelper.getSearchField().getText());
         }
         if (OverlaySearchField.isSearching) {
-            DiffuseLighting.disable();
             setBlitOffset(200);
             if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen) {
                 ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
                 int left = hooks.rei_getContainerLeft(), top = hooks.rei_getContainerTop();
-                for (Slot slot : ((AbstractContainerScreen<?>) MinecraftClient.getInstance().currentScreen).getContainer().slotList)
+                for(Slot slot : ((AbstractContainerScreen<?>) MinecraftClient.getInstance().currentScreen).getContainer().slotList)
                     if (!slot.hasStack() || !ENTRY_LIST_WIDGET.canLastSearchTermsBeAppliedTo(EntryStack.create(slot.getStack())))
                         fillGradient(left + slot.xPosition, top + slot.yPosition, left + slot.xPosition + 16, top + slot.yPosition + 16, -601874400, -601874400);
             }
             setBlitOffset(0);
         }
         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-        DiffuseLighting.disable();
         this.renderWidgets(mouseX, mouseY, delta);
         if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen && ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) {
             ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
-            for (RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
+            for(RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
                 if (area.getScreenClass().equals(MinecraftClient.getInstance().currentScreen.getClass()))
                     if (area.getRectangle().contains(mouseX - hooks.rei_getContainerLeft(), mouseY - hooks.rei_getContainerTop())) {
                         String collect = CollectionUtils.mapAndJoinToString(area.getCategories(), identifier -> RecipeHelper.getInstance().getCategory(identifier).getCategoryName(), ", ");
@@ -473,7 +468,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
         }
         Screen currentScreen = MinecraftClient.getInstance().currentScreen;
         if (!(currentScreen instanceof RecipeViewingScreen) || !((RecipeViewingScreen) currentScreen).choosePageActivated)
-            for (QueuedTooltip queuedTooltip : QUEUED_TOOLTIPS) {
+            for(QueuedTooltip queuedTooltip : QUEUED_TOOLTIPS) {
                 if (queuedTooltip != null)
                     renderTooltip(queuedTooltip);
             }
@@ -508,16 +503,15 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
             QUEUED_TOOLTIPS.add(queuedTooltip);
     }
     
+    @SuppressWarnings("deprecation")
     public void renderWidgets(int int_1, int int_2, float float_1) {
         if (!ScreenHelper.isOverlayVisible())
             return;
         if (!ConfigObject.getInstance().isEntryListWidgetScrolled())
             buttonLeft.enabled = buttonRight.enabled = ENTRY_LIST_WIDGET.getTotalPages() != 1;
-        widgets.forEach(widget -> {
-            DiffuseLighting.disable();
+        for(Widget widget : widgets) {
             widget.render(int_1, int_2, float_1);
-        });
-        DiffuseLighting.disable();
+        }
     }
     
     @Override
@@ -540,7 +534,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
             if (favoritesListWidget != null && favoritesListWidget.mouseScrolled(i, j, amount))
                 return true;
         }
-        for (Widget widget : widgets)
+        for(Widget widget : widgets)
             if (widget != ENTRY_LIST_WIDGET && (favoritesListWidget == null || widget != favoritesListWidget) && widget.mouseScrolled(i, j, amount))
                 return true;
         return false;
@@ -551,7 +545,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
         if (ScreenHelper.isOverlayVisible()) {
             if (ScreenHelper.getSearchField().keyPressed(int_1, int_2, int_3))
                 return true;
-            for (Element listener : widgets)
+            for(Element listener : widgets)
                 if (listener != ScreenHelper.getSearchField() && listener.keyPressed(int_1, int_2, int_3))
                     return true;
         }
@@ -587,7 +581,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
             return false;
         if (ScreenHelper.getSearchField().charTyped(char_1, int_1))
             return true;
-        for (Element listener : widgets)
+        for(Element listener : widgets)
             if (listener != ScreenHelper.getSearchField() && listener.charTyped(char_1, int_1))
                 return true;
         return false;
@@ -604,7 +598,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
             return false;
         if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen && ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) {
             ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
-            for (RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
+            for(RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
                 if (area.getScreenClass().equals(MinecraftClient.getInstance().currentScreen.getClass()))
                     if (area.getRectangle().contains(double_1 - hooks.rei_getContainerLeft(), double_2 - hooks.rei_getContainerTop())) {
                         ClientHelper.getInstance().executeViewAllRecipesFromCategories(Arrays.asList(area.getCategories()));
@@ -612,7 +606,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
                         return true;
                     }
         }
-        for (Element element : widgets)
+        for(Element element : widgets)
             if (element.mouseClicked(double_1, double_2, int_1)) {
                 this.setFocused(element);
                 if (int_1 == 0)
@@ -634,7 +628,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
     }
     
     public boolean isNotInExclusionZones(double mouseX, double mouseY) {
-        for (DisplayHelper.DisplayBoundsHandler<?> handler : DisplayHelper.getInstance().getSortedBoundsHandlers(MinecraftClient.getInstance().currentScreen.getClass())) {
+        for(DisplayHelper.DisplayBoundsHandler<?> handler : DisplayHelper.getInstance().getSortedBoundsHandlers(MinecraftClient.getInstance().currentScreen.getClass())) {
             ActionResult in = handler.isInZone(mouseX, mouseY);
             if (in != ActionResult.PASS)
                 return in == ActionResult.SUCCESS;

+ 0 - 2
src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java

@@ -12,7 +12,6 @@ import me.shedaniel.rei.api.annotations.Internal;
 import me.shedaniel.rei.gui.widget.TextFieldWidget;
 import me.shedaniel.rei.impl.ScreenHelper;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.sound.PositionedSoundInstance;
 import net.minecraft.client.util.InputUtil;
@@ -53,7 +52,6 @@ public class OverlaySearchField extends TextFieldWidget {
     
     @SuppressWarnings("deprecation")
     public void laterRender(int int_1, int int_2, float float_1) {
-        DiffuseLighting.disable();
         RenderSystem.disableDepthTest();
         setEditableColor(ContainerScreenOverlay.getEntryListWidget().getAllStacks().isEmpty() && !getText().isEmpty() ? 16733525 : isSearching ? -852212 : (containsMouse(PointHelper.fromMouse()) || isFocused()) ? (ScreenHelper.isDarkModeEnabled() ? -17587 : -1) : -6250336);
         setSuggestion(!isFocused() && getText().isEmpty() ? I18n.translate("text.rei.search.field.suggestion") : null);

+ 3 - 5
src/main/java/me/shedaniel/rei/gui/PreRecipeViewingScreen.java

@@ -16,7 +16,6 @@ import me.shedaniel.rei.impl.ScreenHelper;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.sound.PositionedSoundInstance;
 import net.minecraft.sound.SoundEvents;
@@ -64,15 +63,14 @@ public class PreRecipeViewingScreen extends Screen {
         this.renderBackground();
         this.drawCenteredString(this.font, this.title.asFormattedString(), this.width / 2, 20, 16777215);
         int i = 30;
-        for (String s : this.font.wrapStringToWidthAsList(I18n.translate("text.rei.recipe_screen_type.selection.sub"), width - 30)) {
+        for(String s : this.font.wrapStringToWidthAsList(I18n.translate("text.rei.recipe_screen_type.selection.sub"), width - 30)) {
             this.drawCenteredString(this.font, Formatting.GRAY.toString() + s, width / 2, i, -1);
             i += 10;
         }
         super.render(int_1, int_2, float_1);
-        this.widgets.forEach(widget -> {
-            DiffuseLighting.disable();
+        for(Widget widget : widgets) {
             widget.render(int_1, int_2, float_1);
-        });
+        }
     }
     
     @Override

+ 4 - 10
src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java

@@ -17,7 +17,6 @@ import me.shedaniel.rei.utils.CollectionUtils;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.sound.PositionedSoundInstance;
 import net.minecraft.client.util.Window;
@@ -372,10 +371,9 @@ public class RecipeViewingScreen extends Screen {
     @Override
     public void render(int mouseX, int mouseY, float delta) {
         this.fillGradient(0, 0, this.width, this.height, -1072689136, -804253680);
-        preWidgets.forEach(widget -> {
-            DiffuseLighting.disable();
+        for(Widget widget : preWidgets) {
             widget.render(mouseX, mouseY, delta);
-        });
+        }
         if (selectedCategory != null)
             selectedCategory.drawCategoryBackground(bounds, mouseX, mouseY, delta);
         else {
@@ -392,19 +390,15 @@ public class RecipeViewingScreen extends Screen {
             if (!tab.isSelected())
                 tab.render(mouseX, mouseY, delta);
         }
-        DiffuseLighting.disable();
         super.render(mouseX, mouseY, delta);
-        widgets.forEach(widget -> {
-            DiffuseLighting.disable();
+        for(Widget widget : widgets) {
             widget.render(mouseX, mouseY, delta);
-        });
+        }
         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-        DiffuseLighting.disable();
         for (TabWidget tab : tabs) {
             if (tab.isSelected())
                 tab.render(mouseX, mouseY, delta);
         }
-        DiffuseLighting.disable();
         ScreenHelper.getLastOverlay().render(mouseX, mouseY, delta);
         ScreenHelper.getLastOverlay().lateRender(mouseX, mouseY, delta);
         if (choosePageActivated) {

+ 2 - 8
src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java

@@ -24,7 +24,6 @@ import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.render.BufferBuilder;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.render.Tessellator;
 import net.minecraft.client.render.VertexFormats;
 import net.minecraft.client.resource.language.I18n;
@@ -349,11 +348,9 @@ public class VillagerRecipeViewingScreen extends Screen {
         updatePosition(delta);
         this.fillGradient(0, 0, this.width, this.height, -1072689136, -804253680);
         int yOffset = 0;
-        this.widgets.forEach(widget -> {
-            DiffuseLighting.disable();
+        for(Widget widget : widgets) {
             widget.render(mouseX, mouseY, delta);
-        });
-        DiffuseLighting.disable();
+        }
         ScreenHelper.getLastOverlay().render(mouseX, mouseY, delta);
         RenderSystem.pushMatrix();
         ScissorsHandler.INSTANCE.scissor(new Rectangle(0, scrollListBounds.y + 1, width, scrollListBounds.height - 2));
@@ -361,14 +358,12 @@ public class VillagerRecipeViewingScreen extends Screen {
             ButtonWidget buttonWidget = buttonWidgets.get(i);
             buttonWidget.getBounds().y = scrollListBounds.y + 1 + yOffset - (int) scroll;
             if (buttonWidget.getBounds().getMaxY() > scrollListBounds.getMinY() && buttonWidget.getBounds().getMinY() < scrollListBounds.getMaxY()) {
-                DiffuseLighting.disable();
                 buttonWidget.render(mouseX, mouseY, delta);
             }
             yOffset += buttonWidget.getBounds().height;
         }
         for (int i = 0; i < buttonWidgets.size(); i++) {
             if (buttonWidgets.get(i).getBounds().getMaxY() > scrollListBounds.getMinY() && buttonWidgets.get(i).getBounds().getMinY() < scrollListBounds.getMaxY()) {
-                DiffuseLighting.disable();
                 recipeRenderers.get(i).setZ(1);
                 recipeRenderers.get(i).render(buttonWidgets.get(i).getBounds(), mouseX, mouseY, delta);
                 ScreenHelper.getLastOverlay().addTooltip(recipeRenderers.get(i).getTooltip(mouseX, mouseY));
@@ -387,7 +382,6 @@ public class VillagerRecipeViewingScreen extends Screen {
             boolean hovered = (new Rectangle(scrollbarPositionMinX, minY, scrollbarPositionMaxX - scrollbarPositionMinX, height)).contains(PointHelper.fromMouse());
             float bottomC = (hovered ? .67f : .5f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f);
             float topC = (hovered ? .87f : .67f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f);
-            DiffuseLighting.disable();
             RenderSystem.disableTexture();
             RenderSystem.enableBlend();
             RenderSystem.disableAlphaTest();

+ 1 - 3
src/main/java/me/shedaniel/rei/gui/entries/SimpleRecipeEntry.java

@@ -12,7 +12,6 @@ import me.shedaniel.rei.gui.widget.EntryWidget;
 import me.shedaniel.rei.gui.widget.QueuedTooltip;
 import me.shedaniel.rei.utils.CollectionUtils;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.Pair;
 import net.minecraft.util.math.MathHelper;
@@ -34,7 +33,7 @@ public class SimpleRecipeEntry extends RecipeEntry {
     
     protected SimpleRecipeEntry(List<List<EntryStack>> input, List<EntryStack> output) {
         List<Pair<List<EntryStack>, AtomicInteger>> newList = Lists.newArrayList();
-        List<Pair<List<EntryStack>, Integer>> a = input.stream().map(stacks -> new Pair<>(stacks, stacks.stream().map(EntryStack::getAmount).max(Integer::compareTo).orElse(1))).collect(Collectors.toList());
+        List<Pair<List<EntryStack>, Integer>> a = CollectionUtils.map(input, stacks -> new Pair<>(stacks, stacks.stream().map(EntryStack::getAmount).max(Integer::compareTo).orElse(1)));
         for (Pair<List<EntryStack>, Integer> pair : a) {
             Optional<Pair<List<EntryStack>, AtomicInteger>> any = newList.stream().filter(pairr -> equalsList(pair.getLeft(), pairr.getLeft())).findAny();
             if (any.isPresent()) {
@@ -95,7 +94,6 @@ public class SimpleRecipeEntry extends RecipeEntry {
         }
         xx = bounds.x + 4 + 18 * (getItemsPerLine() - 2);
         yy = bounds.y + getHeight() / 2 - 8;
-        DiffuseLighting.disable();
         MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
         blit(xx, yy, 0, 28, 18, 18);
         xx += 18;

+ 0 - 3
src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java

@@ -10,7 +10,6 @@ import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.api.ConfigManager;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.render.item.ItemRenderer;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.ItemStack;
@@ -33,14 +32,12 @@ public abstract class CraftableToggleButtonWidget extends ButtonWidget {
     }
     
     public void lateRender(int mouseX, int mouseY, float delta) {
-        DiffuseLighting.disable();
         super.render(mouseX, mouseY, delta);
         
         this.itemRenderer.zOffset = getBlitOffset();
         Rectangle bounds = getBounds();
         this.itemRenderer.renderGuiItem(new ItemStack(Blocks.CRAFTING_TABLE), bounds.x + 2, bounds.y + 2);
         this.itemRenderer.zOffset = 0.0F;
-        DiffuseLighting.disable();
         MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         int color = ConfigManager.getInstance().isCraftableOnlyEnabled() ? 939579655 : 956235776;

+ 147 - 54
src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java

@@ -24,12 +24,14 @@ import me.shedaniel.rei.utils.CollectionUtils;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.network.ClientPlayerEntity;
 import net.minecraft.client.render.BufferBuilder;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.render.Tessellator;
+import net.minecraft.client.render.VertexConsumerProvider;
 import net.minecraft.client.render.VertexFormats;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.sound.PositionedSoundInstance;
 import net.minecraft.client.util.InputUtil;
+import net.minecraft.client.util.math.Matrix4f;
+import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.item.ItemGroup;
 import net.minecraft.sound.SoundEvents;
 import net.minecraft.util.ActionResult;
@@ -63,6 +65,7 @@ public class EntryListWidget extends WidgetWithBounds {
     protected long start;
     protected long duration;
     protected int blockedCount;
+    private boolean debugTime;
     private Rectangle bounds, innerBounds;
     private List<EntryStack> allStacks = null;
     private List<EntryStack> favorites = null;
@@ -75,7 +78,7 @@ public class EntryListWidget extends WidgetWithBounds {
     @SuppressWarnings("rawtypes")
     static boolean notSteppingOnExclusionZones(int left, int top, Rectangle listArea) {
         MinecraftClient instance = MinecraftClient.getInstance();
-        for (DisplayHelper.DisplayBoundsHandler sortedBoundsHandler : DisplayHelper.getInstance().getSortedBoundsHandlers(instance.currentScreen.getClass())) {
+        for(DisplayHelper.DisplayBoundsHandler sortedBoundsHandler : DisplayHelper.getInstance().getSortedBoundsHandlers(instance.currentScreen.getClass())) {
             ActionResult fit = sortedBoundsHandler.canItemSlotWidgetFit(left, top, instance.currentScreen, listArea);
             if (fit != ActionResult.PASS)
                 return fit == ActionResult.SUCCESS;
@@ -188,7 +191,7 @@ public class EntryListWidget extends WidgetWithBounds {
     @Override
     public void render(int mouseX, int mouseY, float delta) {
         if (ConfigObject.getInstance().isEntryListWidgetScrolled()) {
-            for (EntryListEntry entry : entries)
+            for(EntryListEntry entry : entries)
                 entry.clearStacks();
             ScissorsHandler.INSTANCE.scissor(bounds);
             int sizeForFavorites = getSlotsHeightNumberForFavorites();
@@ -196,21 +199,53 @@ public class EntryListWidget extends WidgetWithBounds {
             int nextIndex = skip * innerBounds.width / 18;
             int i = nextIndex;
             blockedCount = 0;
-            if (sizeForFavorites > 0) {
-                drawString(font, I18n.translate("text.rei.favorites"), innerBounds.x + 2, (int) (innerBounds.y + 8 - scroll), -1);
-                nextIndex += innerBounds.width / 18;
-                for (int i1 = 0; i1 < favorites.size(); i1++) {
-                    EntryStack stack = favorites.get(i1);
-                    back1:
+            if (debugTime) {
+                int size = 0;
+                long time = 0;
+                if (sizeForFavorites > 0) {
+                    drawString(font, I18n.translate("text.rei.favorites"), innerBounds.x + 2, (int) (innerBounds.y + 8 - scroll), -1);
+                    nextIndex += innerBounds.width / 18;
+                    for(int i1 = 0; i1 < favorites.size(); i1++) {
+                        EntryStack stack = favorites.get(i1);
+                        back1:
+                        while (true) {
+                            EntryListEntry entry = entries.get(nextIndex);
+                            entry.getBounds().y = (int) (entry.backupY - scroll);
+                            if (entry.getBounds().y > bounds.getMaxY())
+                                break back1;
+                            if (notSteppingOnExclusionZones(entry.getBounds().x, entry.getBounds().y, innerBounds)) {
+                                entry.entry(stack);
+                                entry.isFavorites = true;
+                                size++;
+                                long l = System.currentTimeMillis();
+                                entry.render(mouseX, mouseY, delta);
+                                time += (System.currentTimeMillis() - l);
+                                nextIndex++;
+                                break;
+                            } else {
+                                blockedCount++;
+                                nextIndex++;
+                            }
+                        }
+                    }
+                    nextIndex += innerBounds.width / -18 + getScrollNumberForFavorites() - favorites.size();
+                }
+                int offset = sizeForFavorites > 0 ? -12 : 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 - scroll);
+                        entry.getBounds().y = (int) (entry.backupY - scroll + offset);
                         if (entry.getBounds().y > bounds.getMaxY())
-                            break back1;
+                            break back;
                         if (notSteppingOnExclusionZones(entry.getBounds().x, entry.getBounds().y, innerBounds)) {
                             entry.entry(stack);
-                            entry.isFavorites = true;
+                            entry.isFavorites = false;
+                            size++;
+                            long l = System.currentTimeMillis();
                             entry.render(mouseX, mouseY, delta);
+                            time += (System.currentTimeMillis() - l);
                             nextIndex++;
                             break;
                         } else {
@@ -219,26 +254,62 @@ public class EntryListWidget extends WidgetWithBounds {
                         }
                     }
                 }
-                nextIndex += innerBounds.width / -18 + getScrollNumberForFavorites() - favorites.size();
-            }
-            int offset = sizeForFavorites > 0 ? -12 : 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 - scroll + offset);
-                    if (entry.getBounds().y > bounds.getMaxY())
-                        break back;
-                    if (notSteppingOnExclusionZones(entry.getBounds().x, entry.getBounds().y, innerBounds)) {
-                        entry.entry(stack);
-                        entry.isFavorites = false;
-                        entry.render(mouseX, mouseY, delta);
-                        nextIndex++;
-                        break;
-                    } else {
-                        blockedCount++;
-                        nextIndex++;
+                int z = getZ();
+                setZ(500);
+                String str = String.format("%d entries, avg. %.2fms, %s fps", size, time / (double) size, minecraft.fpsDebugString.split(" ")[0]);
+                fillGradient(bounds.x, bounds.y, bounds.x + font.getStringWidth(str) + 2, bounds.y + font.fontHeight + 2, -16777216, -16777216);
+                MatrixStack matrixStack_1 = new MatrixStack();
+                VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer());
+                matrixStack_1.translate(0.0D, 0.0D, getZ());
+                Matrix4f matrix4f_1 = matrixStack_1.peek().getModel();
+                font.draw(str, bounds.x + 2, bounds.y + 2, -1, false, matrix4f_1, immediate, false, 0, 15728880);
+                immediate.draw();
+                setZ(z);
+            } else {
+                if (sizeForFavorites > 0) {
+                    drawString(font, I18n.translate("text.rei.favorites"), innerBounds.x + 2, (int) (innerBounds.y + 8 - scroll), -1);
+                    nextIndex += innerBounds.width / 18;
+                    for(int i1 = 0; i1 < favorites.size(); i1++) {
+                        EntryStack stack = favorites.get(i1);
+                        back1:
+                        while (true) {
+                            EntryListEntry entry = entries.get(nextIndex);
+                            entry.getBounds().y = (int) (entry.backupY - scroll);
+                            if (entry.getBounds().y > bounds.getMaxY())
+                                break back1;
+                            if (notSteppingOnExclusionZones(entry.getBounds().x, entry.getBounds().y, innerBounds)) {
+                                entry.entry(stack);
+                                entry.isFavorites = true;
+                                entry.render(mouseX, mouseY, delta);
+                                nextIndex++;
+                                break;
+                            } else {
+                                blockedCount++;
+                                nextIndex++;
+                            }
+                        }
+                    }
+                    nextIndex += innerBounds.width / -18 + getScrollNumberForFavorites() - favorites.size();
+                }
+                int offset = sizeForFavorites > 0 ? -12 : 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 - scroll + offset);
+                        if (entry.getBounds().y > bounds.getMaxY())
+                            break back;
+                        if (notSteppingOnExclusionZones(entry.getBounds().x, entry.getBounds().y, innerBounds)) {
+                            entry.entry(stack);
+                            entry.isFavorites = false;
+                            entry.render(mouseX, mouseY, delta);
+                            nextIndex++;
+                            break;
+                        } else {
+                            blockedCount++;
+                            nextIndex++;
+                        }
                     }
                 }
             }
@@ -246,11 +317,33 @@ public class EntryListWidget extends WidgetWithBounds {
             ScissorsHandler.INSTANCE.removeLastScissor();
             renderScrollbar();
         } else {
-            for (EntryListEntry widget : entries) {
-                widget.render(mouseX, mouseY, delta);
-            }
-            for (Widget widget : widgets) {
-                widget.render(mouseX, mouseY, delta);
+            if (debugTime) {
+                int size = 0;
+                long time = 0;
+                for(Widget widget : widgets) {
+                    if (widget instanceof EntryListEntry) {
+                        size++;
+                        long l = System.currentTimeMillis();
+                        widget.render(mouseX, mouseY, delta);
+                        time += (System.currentTimeMillis() - l);
+                    } else
+                        widget.render(mouseX, mouseY, delta);
+                }
+                int z = getZ();
+                setZ(500);
+                String str = String.format("%d entries, avg. %.2fms, %s fps", size, time / (double) size, minecraft.fpsDebugString.split(" ")[0]);
+                fillGradient(bounds.x, bounds.y, bounds.x + font.getStringWidth(str) + 2, bounds.y + font.fontHeight + 2, -16777216, -16777216);
+                MatrixStack matrixStack_1 = new MatrixStack();
+                VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer());
+                matrixStack_1.translate(0.0D, 0.0D, getZ());
+                Matrix4f matrix4f_1 = matrixStack_1.peek().getModel();
+                font.draw(str, bounds.x + 2, bounds.y + 2, -1, false, matrix4f_1, immediate, false, 0, 15728880);
+                immediate.draw();
+                setZ(z);
+            } else {
+                for(Widget widget : widgets) {
+                    widget.render(mouseX, mouseY, delta);
+                }
             }
         }
     }
@@ -297,7 +390,6 @@ public class EntryListWidget extends WidgetWithBounds {
             float bottomC = (hovered ? .67f : .5f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f);
             float topC = (hovered ? .87f : .67f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f);
             
-            DiffuseLighting.disable();
             RenderSystem.disableTexture();
             RenderSystem.enableBlend();
             RenderSystem.disableAlphaTest();
@@ -346,7 +438,7 @@ public class EntryListWidget extends WidgetWithBounds {
     @Override
     public boolean keyPressed(int int_1, int int_2, int int_3) {
         if (containsMouse(PointHelper.fromMouse()))
-            for (Widget widget : widgets)
+            for(Widget widget : widgets)
                 if (widget.keyPressed(int_1, int_2, int_3))
                     return true;
         return false;
@@ -372,8 +464,8 @@ public class EntryListWidget extends WidgetWithBounds {
             List<EntryListEntry> entries = Lists.newLinkedList();
             int width = innerBounds.width / 18;
             int height = innerBounds.height / 18;
-            for (int currentY = 0; currentY < height; currentY++) {
-                for (int currentX = 0; currentX < width; currentX++) {
+            for(int currentY = 0; currentY < height; currentY++) {
+                for(int currentX = 0; currentX < width; currentX++) {
                     if (notSteppingOnExclusionZones(currentX * 18 + innerBounds.x, currentY * 18 + innerBounds.y, innerBounds)) {
                         entries.add((EntryListEntry) new EntryListEntry(currentX * 18 + innerBounds.x, currentY * 18 + innerBounds.y).noBackground());
                     }
@@ -382,7 +474,7 @@ public class EntryListWidget extends WidgetWithBounds {
             page = Math.max(Math.min(page, getTotalPages() - 1), 0);
             int numberForFavorites = getScrollNumberForFavorites();
             List<EntryStack> subList = allStacks.stream().skip(Math.max(0, page * entries.size() - numberForFavorites)).limit(Math.max(0, entries.size() - Math.max(0, numberForFavorites - page * entries.size()))).collect(Collectors.toList());
-            for (int i = 0; i < subList.size(); i++) {
+            for(int i = 0; i < subList.size(); i++) {
                 EntryStack stack = subList.get(i);
                 entries.get(i + Math.max(0, numberForFavorites - page * entries.size())).clearStacks().entry(stack);
                 entries.get(i + Math.max(0, numberForFavorites - page * entries.size())).isFavorites = false;
@@ -397,7 +489,7 @@ public class EntryListWidget extends WidgetWithBounds {
                     j += width;
                 }
                 List<EntryStack> subFavoritesList = favorites.stream().skip(skippedFavorites).limit(Math.max(0, entries.size() - width)).collect(Collectors.toList());
-                for (int i = 0; i < subFavoritesList.size(); i++) {
+                for(int i = 0; i < subFavoritesList.size(); i++) {
                     EntryStack stack = subFavoritesList.get(i);
                     entries.get(j).clearStacks().entry(stack);
                     entries.get(j).isFavorites = true;
@@ -413,7 +505,7 @@ public class EntryListWidget extends WidgetWithBounds {
             int currentX = 0;
             int currentY = 0;
             List<EntryListEntry> entries = Lists.newLinkedList();
-            for (int i = 0; i < slotsToPrepare; i++) {
+            for(int i = 0; i < slotsToPrepare; i++) {
                 int xPos = currentX * 18 + innerBounds.x;
                 int yPos = currentY * 18 + innerBounds.y;
                 entries.add((EntryListEntry) new EntryListEntry(xPos, yPos).noBackground());
@@ -443,7 +535,7 @@ public class EntryListWidget extends WidgetWithBounds {
             List<EntryStack> list = Lists.newLinkedList();
             boolean checkCraftable = ConfigManager.getInstance().isCraftableOnlyEnabled() && !ScreenHelper.inventoryStacks.isEmpty();
             List<EntryStack> workingItems = checkCraftable ? RecipeHelper.getInstance().findCraftableEntriesByItems(CollectionUtils.map(ScreenHelper.inventoryStacks, EntryStack::create)) : null;
-            for (EntryStack stack : EntryRegistry.getInstance().getStacksList()) {
+            for(EntryStack stack : EntryRegistry.getInstance().getStacksList()) {
                 if (canLastSearchTermsBeAppliedTo(stack)) {
                     if (workingItems != null && CollectionUtils.findFirstOrNullEquals(workingItems, stack) == null)
                         continue;
@@ -463,7 +555,7 @@ public class EntryListWidget extends WidgetWithBounds {
             List<EntryStack> list = Lists.newLinkedList();
             boolean checkCraftable = ConfigManager.getInstance().isCraftableOnlyEnabled() && !ScreenHelper.inventoryStacks.isEmpty();
             List<EntryStack> workingItems = checkCraftable ? RecipeHelper.getInstance().findCraftableEntriesByItems(CollectionUtils.map(ScreenHelper.inventoryStacks, EntryStack::create)) : null;
-            for (EntryStack stack : ConfigManager.getInstance().getFavorites()) {
+            for(EntryStack stack : ConfigManager.getInstance().getFavorites()) {
                 if (canLastSearchTermsBeAppliedTo(stack)) {
                     if (workingItems != null && CollectionUtils.findFirstOrNullEquals(workingItems, stack) == null)
                         continue;
@@ -480,6 +572,7 @@ public class EntryListWidget extends WidgetWithBounds {
             favorites = list;
         } else
             favorites = Collections.emptyList();
+        debugTime = ConfigObject.getInstance().doDebugRenderTimeRequired();
         FavoritesListWidget favoritesListWidget = ContainerScreenOverlay.getFavoritesListWidget();
         if (favoritesListWidget != null)
             favoritesListWidget.updateSearch(this, searchTerm);
@@ -496,9 +589,9 @@ public class EntryListWidget extends WidgetWithBounds {
         if (searchArguments.isEmpty())
             return true;
         String mod = null, name = null, tooltip = null, tags[] = null;
-        for (SearchArgument.SearchArguments arguments : searchArguments) {
+        for(SearchArgument.SearchArguments arguments : searchArguments) {
             boolean applicable = true;
-            for (SearchArgument argument : arguments.getArguments()) {
+            for(SearchArgument argument : arguments.getArguments()) {
                 if (argument.getArgumentType() == SearchArgument.ArgumentType.ALWAYS)
                     return true;
                 else if (argument.getArgumentType() == SearchArgument.ArgumentType.MOD) {
@@ -527,19 +620,19 @@ public class EntryListWidget extends WidgetWithBounds {
                         if (stack.getType() == EntryStack.Type.ITEM) {
                             Identifier[] tagsFor = minecraft.getNetworkHandler().getTagManager().items().getTagsFor(stack.getItem()).toArray(new Identifier[0]);
                             tags = new String[tagsFor.length];
-                            for (int i = 0; i < tagsFor.length; i++)
+                            for(int i = 0; i < tagsFor.length; i++)
                                 tags[i] = tagsFor[i].toString();
                         } else if (stack.getType() == EntryStack.Type.FLUID) {
                             Identifier[] tagsFor = minecraft.getNetworkHandler().getTagManager().fluids().getTagsFor(stack.getFluid()).toArray(new Identifier[0]);
                             tags = new String[tagsFor.length];
-                            for (int i = 0; i < tagsFor.length; i++)
+                            for(int i = 0; i < tagsFor.length; i++)
                                 tags[i] = tagsFor[i].toString();
                         } else
                             tags = new String[0];
                     }
                     if (tags != null && tags.length > 0) {
                         boolean a = false;
-                        for (String tag : tags)
+                        for(String tag : tags)
                             if (argument.getFunction(argument.isInclude()).apply(tag))
                                 a = true;
                         if (!a) {
@@ -561,13 +654,13 @@ public class EntryListWidget extends WidgetWithBounds {
     @SuppressWarnings("deprecation")
     private List<SearchArgument.SearchArguments> processSearchTerm(String searchTerm) {
         List<SearchArgument.SearchArguments> searchArguments = Lists.newArrayList();
-        for (String split : StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm.toLowerCase(Locale.ROOT), "|")) {
+        for(String split : StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm.toLowerCase(Locale.ROOT), "|")) {
             String[] terms = StringUtils.split(split);
             if (terms.length == 0)
                 searchArguments.add(SearchArgument.SearchArguments.ALWAYS);
             else {
                 SearchArgument[] arguments = new SearchArgument[terms.length];
-                for (int i = 0; i < terms.length; i++) {
+                for(int i = 0; i < terms.length; i++) {
                     String term = terms[i];
                     if (term.startsWith("-@") || term.startsWith("@-")) {
                         arguments[i] = new SearchArgument(SearchArgument.ArgumentType.MOD, term.substring(2), false);
@@ -619,7 +712,7 @@ public class EntryListWidget extends WidgetWithBounds {
             }
             if (!player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets())
                 return false;
-            for (Widget widget : children())
+            for(Widget widget : children())
                 if (widget.mouseClicked(double_1, double_2, int_1))
                     return true;
         }

+ 0 - 2
src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java

@@ -152,7 +152,6 @@ public class EntryWidget extends WidgetWithBounds {
     }
     
     protected void drawHighlighted(int mouseX, int mouseY, float delta) {
-        RenderSystem.disableLighting();
         RenderSystem.disableDepthTest();
         RenderSystem.colorMask(true, true, true, false);
         int color = ScreenHelper.isDarkModeEnabled() ? -1877929711 : -2130706433;
@@ -161,7 +160,6 @@ public class EntryWidget extends WidgetWithBounds {
         fillGradient(bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), color, color);
         setZ(0);
         RenderSystem.colorMask(true, true, true, true);
-        RenderSystem.enableLighting();
         RenderSystem.enableDepthTest();
     }
     

+ 0 - 2
src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java

@@ -22,7 +22,6 @@ import me.shedaniel.rei.utils.CollectionUtils;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.network.ClientPlayerEntity;
 import net.minecraft.client.render.BufferBuilder;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.render.Tessellator;
 import net.minecraft.client.render.VertexFormats;
 import net.minecraft.client.resource.language.I18n;
@@ -180,7 +179,6 @@ public class FavoritesListWidget extends WidgetWithBounds {
             float bottomC = (hovered ? .67f : .5f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f);
             float topC = (hovered ? .87f : .67f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f);
             
-            DiffuseLighting.disable();
             RenderSystem.disableTexture();
             RenderSystem.enableBlend();
             RenderSystem.disableAlphaTest();

+ 0 - 2
src/main/java/me/shedaniel/rei/gui/widget/PanelWidget.java

@@ -10,7 +10,6 @@ import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.api.ConfigObject;
 import me.shedaniel.rei.gui.config.RecipeScreenType;
 import me.shedaniel.rei.impl.ScreenHelper;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.util.Identifier;
 
 import java.util.Collections;
@@ -59,7 +58,6 @@ public class PanelWidget extends WidgetWithBounds {
         float blue = ((color >> 0) & 0xFF) / 255f;
         float alpha = ((color >> 32) & 0xFF) / 255f;
         RenderSystem.color4f(red, green, blue, alpha);
-        DiffuseLighting.disable();
         minecraft.getTextureManager().bindTexture(ScreenHelper.isDarkModeEnabled() ? CHEST_GUI_TEXTURE_DARK : CHEST_GUI_TEXTURE);
         int x = bounds.x, y = bounds.y, width = bounds.width, height = bounds.height;
         int xTextureOffset = getXTextureOffset();

+ 0 - 4
src/main/java/me/shedaniel/rei/gui/widget/RecipeArrowWidget.java

@@ -5,12 +5,10 @@
 
 package me.shedaniel.rei.gui.widget;
 
-import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.plugin.DefaultPlugin;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.util.math.MathHelper;
 
 import java.util.Collections;
@@ -34,8 +32,6 @@ public class RecipeArrowWidget extends WidgetWithBounds {
     
     @Override
     public void render(int mouseX, int mouseY, float delta) {
-        RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-        DiffuseLighting.disable();
         MinecraftClient.getInstance().getTextureManager().bindTexture(DefaultPlugin.getDisplayTexture());
         blit(x, y, 106, 91, 24, 17);
         if (animated) {

+ 4 - 6
src/main/java/me/shedaniel/rei/gui/widget/RecipeChoosePageWidget.java

@@ -12,7 +12,6 @@ import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.gui.RecipeViewingScreen;
 import me.shedaniel.rei.impl.ScreenHelper;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.util.Window;
 import net.minecraft.util.math.MathHelper;
@@ -139,12 +138,11 @@ public class RecipeChoosePageWidget extends DraggableWidget {
     
     @Override
     public void render(int i, int i1, float v) {
-        widgets.forEach(widget -> {
-            DiffuseLighting.disable();
-            RenderSystem.translatef(0, 0, 800);
+        RenderSystem.translatef(0, 0, 800);
+        for(Widget widget : widgets) {
             widget.render(i, i1, v);
-            RenderSystem.translatef(0, 0, -800);
-        });
+        }
+        RenderSystem.translatef(0, 0, -800);
     }
     
     @Override

+ 0 - 4
src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java

@@ -5,13 +5,11 @@
 
 package me.shedaniel.rei.gui.widget;
 
-import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.api.ClientHelper;
 import me.shedaniel.rei.api.EntryStack;
 import me.shedaniel.rei.api.RecipeCategory;
 import me.shedaniel.rei.impl.ScreenHelper;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.util.Formatting;
 import net.minecraft.util.Identifier;
 
@@ -68,8 +66,6 @@ public class TabWidget extends WidgetWithBounds {
     @Override
     public void render(int mouseX, int mouseY, float delta) {
         if (shown) {
-            RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-            DiffuseLighting.disable();
             minecraft.getTextureManager().bindTexture(ScreenHelper.isDarkModeEnabled() ? CHEST_GUI_TEXTURE_DARK : CHEST_GUI_TEXTURE);
             this.blit(bounds.x, bounds.y + 2, selected ? 28 : 0, 192, 28, (selected ? 30 : 27));
             logo.setZ(100);

+ 12 - 0
src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java

@@ -208,6 +208,16 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData {
         return appearance.displayFavoritesOnTheLeft;
     }
     
+    @Override
+    public boolean doesFastEntryRendering() {
+        return performance.fastEntryRendering;
+    }
+    
+    @Override
+    public boolean doDebugRenderTimeRequired() {
+        return technical.debugRenderTimeRequired;
+    }
+    
     @Override
     public InputUtil.KeyCode getFavoriteKeybind() {
         return general.favoriteKeybind == null ? InputUtil.UNKNOWN_KEYCODE : general.favoriteKeybind;
@@ -255,6 +265,7 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData {
         private String giveCommand = "/give {player_name} {item_identifier}{nbt} {count}";
         @Comment("Declares the command used to change weather.") private String weatherCommand = "/weather {weather}";
         private boolean registerRecipesInAnotherThread = true;
+        private boolean debugRenderTimeRequired = false;
     }
     
     public static class Modules {
@@ -270,5 +281,6 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData {
     public static class Performance {
         @Comment("Whether REI should render entry's enchantment glint")
         private boolean renderEntryEnchantmentGlint = true;
+        @ConfigEntry.Gui.Excluded private boolean fastEntryRendering = false;
     }
 }

+ 0 - 2
src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java

@@ -15,7 +15,6 @@ import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler;
 import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.BufferBuilder;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.render.Tessellator;
 import net.minecraft.client.render.VertexFormats;
 import net.minecraft.client.texture.Sprite;
@@ -185,7 +184,6 @@ public class FluidEntryStack extends AbstractEntryStack {
                 int g = (color >> 8 & 255);
                 int b = (color & 255);
                 MinecraftClient.getInstance().getTextureManager().bindTexture(SpriteAtlasTexture.BLOCK_ATLAS_TEX);
-                DiffuseLighting.disable();
                 Tessellator tess = Tessellator.getInstance();
                 BufferBuilder bb = tess.getBuffer();
                 bb.begin(7, VertexFormats.POSITION_TEXTURE_COLOR);

+ 58 - 15
src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java

@@ -6,21 +6,28 @@
 package me.shedaniel.rei.impl;
 
 import com.google.common.collect.Lists;
+import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.math.api.Rectangle;
-import me.shedaniel.rei.api.ClientHelper;
-import me.shedaniel.rei.api.ConfigObject;
-import me.shedaniel.rei.api.EntryStack;
-import me.shedaniel.rei.api.ItemStackRenderOverlayHook;
+import me.shedaniel.rei.api.*;
 import me.shedaniel.rei.gui.widget.QueuedTooltip;
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.render.*;
+import net.minecraft.client.render.item.BuiltinModelItemRenderer;
 import net.minecraft.client.render.item.ItemRenderer;
+import net.minecraft.client.render.model.BakedModel;
+import net.minecraft.client.render.model.json.ModelTransformation;
+import net.minecraft.client.texture.SpriteAtlasTexture;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.registry.Registry;
 
 import javax.annotation.Nullable;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 
 @Deprecated
@@ -60,7 +67,7 @@ public class ItemEntryStack extends AbstractEntryStack {
     @Override
     public EntryStack copy() {
         EntryStack stack = EntryStack.create(getItemStack().copy());
-        for (Map.Entry<Settings, Object> entry : getSettings().entrySet()) {
+        for(Map.Entry<Settings, Object> entry : getSettings().entrySet()) {
             stack.setting(entry.getKey(), entry.getValue());
         }
         return stack;
@@ -125,7 +132,7 @@ public class ItemEntryStack extends AbstractEntryStack {
         if (getSetting(Settings.TOOLTIP_APPEND_MOD).value().get() && ConfigObject.getInstance().shouldAppendModNames()) {
             final String modString = ClientHelper.getInstance().getFormattedModFromItem(getItem());
             boolean alreadyHasMod = false;
-            for (String s : toolTip)
+            for(String s : toolTip)
                 if (s.equalsIgnoreCase(modString)) {
                     alreadyHasMod = true;
                     break;
@@ -140,15 +147,51 @@ public class ItemEntryStack extends AbstractEntryStack {
     public void render(Rectangle bounds, int mouseX, int mouseY, float delta) {
         if (!isEmpty() && getSetting(Settings.RENDER).value().get()) {
             ItemStack stack = getItemStack();
-            ((ItemStackRenderOverlayHook) (Object) stack).rei_setRenderEnchantmentGlint(getSetting(Settings.Item.RENDER_ENCHANTMENT_GLINT).value().get());
-            ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer();
-            itemRenderer.zOffset = getZ();
-            int i1 = bounds.getCenterX() - 8;
-            int i2 = bounds.getCenterY() - 8;
-            itemRenderer.renderGuiItemIcon(stack, i1, i2);
-            itemRenderer.renderGuiItemOverlay(MinecraftClient.getInstance().textRenderer, stack, i1, i2, getSetting(Settings.RENDER_COUNTS).value().get() ? getSetting(Settings.COUNTS).value().apply(this) : "");
-            itemRenderer.zOffset = 0.0F;
-            ((ItemStackRenderOverlayHook) (Object) stack).rei_setRenderEnchantmentGlint(true);
+            if (ConfigObject.getInstance().doesFastEntryRendering()) {
+                ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer();
+                BakedModel model = itemRenderer.getModels().getModel(stack);
+                if (stack.getItem().hasPropertyGetters())
+                    model = model.getItemPropertyOverrides().apply(model, stack, null, null);
+                if (model != null) {
+                    GlStateManager.pushMatrix();
+                    MinecraftClient.getInstance().getTextureManager().bindTexture(SpriteAtlasTexture.BLOCK_ATLAS_TEX);
+                    GlStateManager.enableRescaleNormal();
+                    GlStateManager.translatef(bounds.getCenterX(), bounds.getCenterY(), 100.0F + getZ());
+                    GlStateManager.scalef(16.0F, -16.0F, 16.0F);
+                    MatrixStack matrices = new MatrixStack();
+                    VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers();
+                    Item item = stack.getItem();
+                    boolean bl = !model.hasDepthInGui() || item == Items.SHIELD || item == Items.TRIDENT;
+                    if (bl)
+                        GlStateManager.method_24221();
+                    model.getTransformation().getTransformation(ModelTransformation.Type.GUI).apply(false, matrices);
+                    matrices.translate(-0.5D, -0.5D, -0.5D);
+                    if (!model.isBuiltin()) {
+                        RenderLayer renderLayer = RenderLayers.getItemLayer(stack);
+                        if (Objects.equals(renderLayer, TexturedRenderLayers.getEntityTranslucent()))
+                            renderLayer = TexturedRenderLayers.getEntityTranslucentCull();
+                        VertexConsumer vertexConsumer = stack.hasEnchantmentGlint() && getSetting(Settings.Item.RENDER_ENCHANTMENT_GLINT).value().get() ? VertexConsumers.dual(immediate.getBuffer(RenderLayer.getGlint()), immediate.getBuffer(renderLayer)) : immediate.getBuffer(renderLayer);
+                        ((ItemRendererHooks) itemRenderer).rei_renderBakedItemModel(model, stack, 15728880, OverlayTexture.DEFAULT_UV, matrices, vertexConsumer);
+                    } else {
+                        BuiltinModelItemRenderer.INSTANCE.render(stack, matrices, immediate, 15728880, OverlayTexture.DEFAULT_UV);
+                    }
+                    immediate.draw();
+                    if (bl)
+                        GlStateManager.method_24222();
+                    GlStateManager.disableRescaleNormal();
+                    GlStateManager.popMatrix();
+                }
+            } else {
+                ((ItemStackHook) (Object) stack).rei_setRenderEnchantmentGlint(getSetting(Settings.Item.RENDER_ENCHANTMENT_GLINT).value().get());
+                ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer();
+                itemRenderer.zOffset = getZ();
+                int i1 = bounds.getCenterX() - 8;
+                int i2 = bounds.getCenterY() - 8;
+                itemRenderer.renderGuiItemIcon(stack, i1, i2);
+                itemRenderer.renderGuiItemOverlay(MinecraftClient.getInstance().textRenderer, stack, i1, i2, getSetting(Settings.RENDER_COUNTS).value().get() ? getSetting(Settings.COUNTS).value().apply(this) : "");
+                itemRenderer.zOffset = 0.0F;
+                ((ItemStackHook) (Object) stack).rei_setRenderEnchantmentGlint(true);
+            }
         }
     }
 }

+ 21 - 0
src/main/java/me/shedaniel/rei/mixin/MixinItemRenderer.java

@@ -0,0 +1,21 @@
+package me.shedaniel.rei.mixin;
+
+import me.shedaniel.rei.api.ItemRendererHooks;
+import net.minecraft.client.render.VertexConsumer;
+import net.minecraft.client.render.item.ItemRenderer;
+import net.minecraft.client.render.model.BakedModel;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.item.ItemStack;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+
+@Mixin(ItemRenderer.class)
+public abstract class MixinItemRenderer implements ItemRendererHooks {
+    @Shadow
+    protected abstract void renderBakedItemModel(BakedModel model, ItemStack stack, int light, int overlay, MatrixStack matrices, VertexConsumer vertices);
+    
+    @Override
+    public void rei_renderBakedItemModel(BakedModel model, ItemStack stack, int light, int overlay, MatrixStack matrices, VertexConsumer vertices) {
+        this.renderBakedItemModel(model, stack, light, overlay, matrices, vertices);
+    }
+}

+ 2 - 2
src/main/java/me/shedaniel/rei/mixin/MixinItemStack.java

@@ -5,7 +5,7 @@
 
 package me.shedaniel.rei.mixin;
 
-import me.shedaniel.rei.api.ItemStackRenderOverlayHook;
+import me.shedaniel.rei.api.ItemStackHook;
 import net.minecraft.item.ItemStack;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.injection.At;
@@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 
 @Mixin(ItemStack.class)
-public class MixinItemStack implements ItemStackRenderOverlayHook {
+public class MixinItemStack implements ItemStackHook {
     private boolean rei_dontRenderOverlay = false;
     
     @Override

+ 2 - 6
src/main/java/me/shedaniel/rei/plugin/brewing/DefaultBrewingCategory.java

@@ -5,7 +5,6 @@
 
 package me.shedaniel.rei.plugin.brewing;
 
-import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.math.api.Point;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.api.EntryStack;
@@ -16,13 +15,12 @@ import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.plugin.DefaultPlugin;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.Items;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
 
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.function.Supplier;
@@ -48,12 +46,10 @@ public class DefaultBrewingCategory implements RecipeCategory<DefaultBrewingDisp
     public List<Widget> setupDisplay(Supplier<DefaultBrewingDisplay> recipeDisplaySupplier, Rectangle bounds) {
         final DefaultBrewingDisplay recipeDisplay = recipeDisplaySupplier.get();
         Point startPoint = new Point(bounds.getCenterX() - 52, bounds.getCenterY() - 29);
-        List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
+        List<Widget> widgets = new LinkedList<>(Collections.singletonList(new RecipeBaseWidget(bounds) {
             @Override
             public void render(int mouseX, int mouseY, float delta) {
                 super.render(mouseX, mouseY, delta);
-                RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-                DiffuseLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DefaultPlugin.getDisplayTexture());
                 blit(startPoint.x, startPoint.y, 0, 108, 103, 59);
                 int width = MathHelper.ceil((System.currentTimeMillis() / 250 % 18d) / 1f);

+ 2 - 6
src/main/java/me/shedaniel/rei/plugin/campfire/DefaultCampfireCategory.java

@@ -5,7 +5,6 @@
 
 package me.shedaniel.rei.plugin.campfire;
 
-import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.math.api.Point;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.api.EntryStack;
@@ -18,12 +17,11 @@ import me.shedaniel.rei.impl.ScreenHelper;
 import me.shedaniel.rei.plugin.DefaultPlugin;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
 
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.function.Supplier;
@@ -48,12 +46,10 @@ public class DefaultCampfireCategory implements RecipeCategory<DefaultCampfireDi
     @Override
     public List<Widget> setupDisplay(Supplier<DefaultCampfireDisplay> recipeDisplaySupplier, Rectangle bounds) {
         Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27);
-        List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
+        List<Widget> widgets = new LinkedList<>(Collections.singletonList(new RecipeBaseWidget(bounds) {
             @Override
             public void render(int mouseX, int mouseY, float delta) {
                 super.render(mouseX, mouseY, delta);
-                RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-                DiffuseLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DefaultPlugin.getDisplayTexture());
                 blit(startPoint.x, startPoint.y, 0, 167, 82, 54);
                 int height = MathHelper.ceil((System.currentTimeMillis() / 250 % 14d) / 1f);

+ 0 - 4
src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java

@@ -6,7 +6,6 @@
 package me.shedaniel.rei.plugin.composting;
 
 import com.google.common.collect.Lists;
-import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.math.api.Point;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.api.EntryStack;
@@ -19,7 +18,6 @@ import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.plugin.DefaultPlugin;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.ItemConvertible;
 import net.minecraft.util.Identifier;
@@ -77,8 +75,6 @@ public class DefaultCompostingCategory implements RecipeCategory<DefaultComposti
         widgets.add(new RecipeBaseWidget(bounds) {
             @Override
             public void render(int mouseX, int mouseY, float partialTicks) {
-                RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-                DiffuseLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DefaultPlugin.getDisplayTexture());
                 this.blit(startingPoint.x, startingPoint.y, 28, 221, 55, 26);
             }

+ 1 - 5
src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingCategory.java

@@ -20,12 +20,10 @@ import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.plugin.DefaultPlugin;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.DrawableHelper;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
@@ -55,12 +53,10 @@ public class DefaultCookingCategory implements TransferRecipeCategory<DefaultCoo
     @Override
     public List<Widget> setupDisplay(Supplier<DefaultCookingDisplay> recipeDisplaySupplier, Rectangle bounds) {
         Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27);
-        List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
+        List<Widget> widgets = new LinkedList<>(Collections.singletonList(new RecipeBaseWidget(bounds) {
             @Override
             public void render(int mouseX, int mouseY, float delta) {
                 super.render(mouseX, mouseY, delta);
-                RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-                DiffuseLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DefaultPlugin.getDisplayTexture());
                 blit(startPoint.x, startPoint.y, 0, 54, 82, 54);
                 int height = MathHelper.ceil((System.currentTimeMillis() / 250 % 14d) / 1f);

+ 2 - 6
src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingCategory.java

@@ -22,13 +22,11 @@ import me.shedaniel.rei.server.ContainerInfoHandler;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.DrawableHelper;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
 
-import java.util.Arrays;
-import java.util.LinkedList;
+import java.util.Collections;
 import java.util.List;
 import java.util.function.Supplier;
 
@@ -63,12 +61,10 @@ public class DefaultCraftingCategory implements TransferRecipeCategory<DefaultCr
     @Override
     public List<Widget> setupDisplay(Supplier<DefaultCraftingDisplay> recipeDisplaySupplier, Rectangle bounds) {
         Point startPoint = new Point(bounds.getCenterX() - 58, bounds.getCenterY() - 27);
-        List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
+        List<Widget> widgets = Lists.newLinkedList(Collections.singletonList(new RecipeBaseWidget(bounds) {
             @Override
             public void render(int mouseX, int mouseY, float delta) {
                 super.render(mouseX, mouseY, delta);
-                RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-                DiffuseLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DefaultPlugin.getDisplayTexture());
                 blit(startPoint.x, startPoint.y, 0, 0, 116, 54);
             }

+ 2 - 6
src/main/java/me/shedaniel/rei/plugin/stonecutting/DefaultStoneCuttingCategory.java

@@ -5,7 +5,6 @@
 
 package me.shedaniel.rei.plugin.stonecutting;
 
-import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.math.api.Point;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.api.EntryStack;
@@ -16,11 +15,10 @@ import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.plugin.DefaultPlugin;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.util.Identifier;
 
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.function.Supplier;
@@ -45,12 +43,10 @@ public class DefaultStoneCuttingCategory implements RecipeCategory<DefaultStoneC
     @Override
     public List<Widget> setupDisplay(Supplier<DefaultStoneCuttingDisplay> recipeDisplaySupplier, Rectangle bounds) {
         Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 13);
-        List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
+        List<Widget> widgets = new LinkedList<>(Collections.singletonList(new RecipeBaseWidget(bounds) {
             @Override
             public void render(int mouseX, int mouseY, float delta) {
                 super.render(mouseX, mouseY, delta);
-                RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-                DiffuseLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DefaultPlugin.getDisplayTexture());
                 blit(startPoint.x, startPoint.y, 0, 221, 82, 26);
             }

+ 2 - 6
src/main/java/me/shedaniel/rei/plugin/stripping/DefaultStrippingCategory.java

@@ -5,7 +5,6 @@
 
 package me.shedaniel.rei.plugin.stripping;
 
-import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.math.api.Point;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.api.EntryStack;
@@ -15,12 +14,11 @@ import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.plugin.DefaultPlugin;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.DiffuseLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.Items;
 import net.minecraft.util.Identifier;
 
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.function.Supplier;
@@ -45,12 +43,10 @@ public class DefaultStrippingCategory implements RecipeCategory<DefaultStripping
     @Override
     public List<Widget> setupDisplay(Supplier<DefaultStrippingDisplay> recipeDisplaySupplier, Rectangle bounds) {
         Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 13);
-        List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
+        List<Widget> widgets = new LinkedList<>(Collections.singletonList(new RecipeBaseWidget(bounds) {
             @Override
             public void render(int mouseX, int mouseY, float delta) {
                 super.render(mouseX, mouseY, delta);
-                RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-                DiffuseLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DefaultPlugin.getDisplayTexture());
                 blit(startPoint.x, startPoint.y, 0, 221, 82, 26);
             }

+ 1 - 0
src/main/resources/assets/roughlyenoughitems/lang/en_us.json

@@ -112,6 +112,7 @@
   "config.roughlyenoughitems.mirrorItemPanel": "Item List Position:",
   "config.roughlyenoughitems.mirrorItemPanel.boolean.true": "Left Side",
   "config.roughlyenoughitems.mirrorItemPanel.boolean.false": "Right Side",
+  "config.roughlyenoughitems.debugRenderTimeRequired": "Entry List Debug Mode:",
   "config.roughlyenoughitems.searchFieldLocation": "Search Field Position:",
   "config.roughlyenoughitems.searchFieldLocation.bottom_side": "Bottom Left / Right",
   "config.roughlyenoughitems.searchFieldLocation.top_side": "Top Left / Right",

+ 2 - 1
src/main/resources/mixin.roughlyenoughitems.json

@@ -6,7 +6,8 @@
   "mixins": [],
   "client": [
     "MixinBrewingRecipeRegistry",
-    "MixinItemStack"
+    "MixinItemStack",
+    "MixinItemRenderer"
   ],
   "injectors": {
     "defaultRequire": 1