From 86f38210276a7d32cab8e5f802717fa7536e0e42 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 17 Jul 2023 02:21:05 +0800 Subject: Overlay errors for display tooltips --- .../client/gui/widget/DisplayTooltipComponent.java | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'runtime/src/main/java/me') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java index 1d7a9f17e..214388dc3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java @@ -23,26 +23,36 @@ package me.shedaniel.rei.impl.client.gui.widget; +import com.google.common.base.Suppliers; import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; +import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.client.util.MatrixUtils; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.impl.display.DisplaySpec; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.world.inventory.tooltip.TooltipComponent; import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; public class DisplayTooltipComponent implements TooltipComponent, ClientTooltipComponent { + private final List widgets; private final Widget widget; private final DisplaySpec display; private final Rectangle bounds; + private final Supplier autoCraftingResult = + Suppliers.memoizeWithExpiration(this::evaluateAutoCrafting, 1000, TimeUnit.MILLISECONDS); public DisplayTooltipComponent(DisplaySpec display) { Display internalDisplay = display.provideInternalDisplay(); @@ -52,15 +62,22 @@ public class DisplayTooltipComponent implements TooltipComponent, ClientTooltipC List widgets = configuration.getView(internalDisplay).setupDisplay(internalDisplay, bounds); this.display = display; + this.widgets = widgets; this.widget = Widgets.concat(widgets); } public DisplayTooltipComponent(DisplaySpec display, List widgets, Rectangle bounds) { + this.widgets = widgets; this.widget = Widgets.concat(widgets); this.display = display; this.bounds = bounds; } + private AutoCraftingEvaluator.AutoCraftingResult evaluateAutoCrafting() { + if (this.display == null) return new AutoCraftingEvaluator.AutoCraftingResult(); + return AutoCraftingEvaluator.evaluateAutoCrafting(false, false, this.display.provideInternalDisplay(), this.display::provideInternalDisplayIds); + } + @Override public int getHeight() { return bounds.height + 4; @@ -77,6 +94,17 @@ public class DisplayTooltipComponent implements TooltipComponent, ClientTooltipC matrices.translate(x + 2, y + 2, z); matrices.translate(-this.bounds.getX(), -this.bounds.getY(), 0); widget.render(matrices, -1000, -1000, 0); + + AutoCraftingEvaluator.AutoCraftingResult craftingResult = autoCraftingResult.get(); + if (craftingResult.hasApplicable && craftingResult.renderer != null) { + matrices.pushPose(); + Rectangle transformedBounds = MatrixUtils.transform(MatrixUtils.inverse(matrices.last().pose()), new Rectangle(x + 2, y + 2, bounds.width, bounds.height)); + Point mouse = MatrixUtils.transform(matrices.last().pose(), PointHelper.ofMouse()); + craftingResult.renderer.render(matrices, mouse.x, mouse.y, Minecraft.getInstance().getDeltaFrameTime(), + widgets, transformedBounds, display.provideInternalDisplay()); + matrices.popPose(); + } + matrices.popPose(); } } -- cgit