From f4ec48ad1539bdc0ea5f54931740adf4bcb0560b Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 26 Jun 2022 04:09:06 +0800 Subject: Adapt scissors to transform --- .../api/client/gui/widgets/CloseableScissors.java | 12 +++++++++ .../rei/api/client/gui/widgets/Widget.java | 24 +++++++++++++++++ .../categories/DefaultInformationCategory.java | 21 ++++++++------- .../beacon/DefaultBeaconBaseCategory.java | 31 ++++++++++------------ .../beacon/DefaultBeaconPaymentCategory.java | 31 ++++++++++------------ .../client/categories/tag/DefaultTagCategory.java | 6 ++--- .../rei/impl/client/gui/widget/OverflowWidget.java | 10 ++++--- 7 files changed, 85 insertions(+), 50 deletions(-) create mode 100644 api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/CloseableScissors.java diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/CloseableScissors.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/CloseableScissors.java new file mode 100644 index 000000000..226c33ffc --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/CloseableScissors.java @@ -0,0 +1,12 @@ +package me.shedaniel.rei.api.client.gui.widgets; + +import org.jetbrains.annotations.ApiStatus; + +import java.io.Closeable; + +@ApiStatus.NonExtendable +@ApiStatus.Experimental +public interface CloseableScissors extends Closeable { + @Override + void close(); +} diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java index 3c753e747..1c70c616d 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java @@ -26,6 +26,7 @@ package me.shedaniel.rei.api.client.gui.widgets; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix4f; import com.mojang.math.Vector4f; +import me.shedaniel.clothconfig2.api.ScissorsHandler; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; @@ -35,7 +36,11 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; +import java.io.Closeable; +import java.io.IOException; import java.util.Stack; /** @@ -115,4 +120,23 @@ public abstract class Widget extends AbstractContainerEventHandler implements ne public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { render(matrices, mouseX, mouseY, delta); } + + @ApiStatus.Experimental + public static CloseableScissors scissor(PoseStack matrices, Rectangle bounds) { + return scissor(matrices.last().pose(), bounds); + } + + @ApiStatus.Experimental + public static CloseableScissors scissor(Matrix4f matrix, Rectangle bounds) { + Vector4f vec1 = new Vector4f((float) bounds.x, (float) bounds.y, 0, 1); + vec1.transform(matrix); + Vector4f vec2 = new Vector4f((float) bounds.getMaxX(), (float) bounds.getMaxY(), 0, 1); + vec2.transform(matrix); + int x1 = Math.round(vec1.x()); + int x2 = Math.round(vec2.x()); + int y1 = Math.round(vec1.y()); + int y2 = Math.round(vec2.y()); + ScissorsHandler.INSTANCE.scissor(new Rectangle(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1))); + return ScissorsHandler.INSTANCE::removeLastScissor; + } } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultInformationCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultInformationCategory.java index 5cb04c7cd..0f7baf641 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultInformationCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultInformationCategory.java @@ -36,6 +36,7 @@ import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.gui.AbstractRenderer; import me.shedaniel.rei.api.client.gui.DisplayRenderer; import me.shedaniel.rei.api.client.gui.Renderer; +import me.shedaniel.rei.api.client.gui.widgets.CloseableScissors; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.api.client.gui.widgets.Widgets; @@ -194,18 +195,18 @@ public class DefaultInformationCategory implements DisplayCategory= innerBounds.y && currentY <= innerBounds.getMaxY()) { - font.draw(matrices, text, innerBounds.x + 2, currentY + 2, REIRuntime.getInstance().isDarkThemeEnabled() ? 0xFFBBBBBB : 0xFF090909); + try (CloseableScissors scissors = scissor(matrices, innerBounds)) { + int currentY = -scrolling.scrollAmountInt() + innerBounds.y; + for (FormattedCharSequence text : texts) { + if (text != null && currentY + font.lineHeight >= innerBounds.y && currentY <= innerBounds.getMaxY()) { + font.draw(matrices, text, innerBounds.x + 2, currentY + 2, REIRuntime.getInstance().isDarkThemeEnabled() ? 0xFFBBBBBB : 0xFF090909); + } + currentY += text == null ? 4 : font.lineHeight; } - currentY += text == null ? 4 : font.lineHeight; } - ScissorsHandler.INSTANCE.removeLastScissor(); - ScissorsHandler.INSTANCE.scissor(scrolling.getBounds()); - scrolling.renderScrollBar(0xff000000, 1, REIRuntime.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); - ScissorsHandler.INSTANCE.removeLastScissor(); + try (CloseableScissors scissors = scissor(matrices, scrolling.getBounds())) { + scrolling.renderScrollBar(0xff000000, 1, REIRuntime.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); + } } @Override diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconBaseCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconBaseCategory.java index d2dd424cf..645457e13 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconBaseCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconBaseCategory.java @@ -33,10 +33,7 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.gui.DisplayRenderer; import me.shedaniel.rei.api.client.gui.Renderer; -import me.shedaniel.rei.api.client.gui.widgets.Slot; -import me.shedaniel.rei.api.client.gui.widgets.Widget; -import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; -import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.util.CollectionUtils; @@ -158,21 +155,21 @@ public class DefaultBeaconBaseCategory implements DisplayCategory