diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-03-28 02:08:07 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-03-28 02:08:07 +0800 |
| commit | 9d835c7823978e04007414cfe3ebf128e23a6494 (patch) | |
| tree | 116461d55ea4b3b233145e739e60437db9ddc569 /api/src/main/java | |
| parent | c80c345c4fa3def0536bcecbc2223f202af79415 (diff) | |
| download | RoughlyEnoughItems-9d835c7823978e04007414cfe3ebf128e23a6494.tar.gz RoughlyEnoughItems-9d835c7823978e04007414cfe3ebf128e23a6494.tar.bz2 RoughlyEnoughItems-9d835c7823978e04007414cfe3ebf128e23a6494.zip | |
A simpler implementation of stacked favorites
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'api/src/main/java')
| -rw-r--r-- | api/src/main/java/me/shedaniel/rei/api/client/favorites/CompoundFavoriteRenderer.java | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/favorites/CompoundFavoriteRenderer.java b/api/src/main/java/me/shedaniel/rei/api/client/favorites/CompoundFavoriteRenderer.java new file mode 100644 index 000000000..623c37606 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/client/favorites/CompoundFavoriteRenderer.java @@ -0,0 +1,120 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020 shedaniel + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.shedaniel.rei.api.client.favorites; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Vector4f; +import me.shedaniel.clothconfig2.api.ScissorsHandler; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.AbstractRenderer; +import me.shedaniel.rei.api.client.gui.Renderer; +import me.shedaniel.rei.api.common.util.Animator; +import net.minecraft.Util; + +import java.util.List; +import java.util.function.IntFunction; +import java.util.function.IntSupplier; + +public class CompoundFavoriteRenderer extends AbstractRenderer { + protected Animator offset = new Animator(0); + protected Rectangle scissorArea = new Rectangle(); + protected long nextSwitch = -1; + protected IntFunction<Renderer> renderers; + protected int count; + protected boolean showcase; + protected IntSupplier supplier; + + /** + * Showcase + */ + public CompoundFavoriteRenderer(List<Renderer> renderers) { + this(true, renderers, null); + } + + /** + * Non showcase + */ + public CompoundFavoriteRenderer(List<Renderer> renderers, IntSupplier supplier) { + this(false, renderers, supplier); + } + + public CompoundFavoriteRenderer(boolean showcase, List<Renderer> renderers, IntSupplier supplier) { + this(showcase, renderers.size(), renderers::get, supplier); + } + + /** + * Showcase + */ + public CompoundFavoriteRenderer(int count, IntFunction<Renderer> renderers) { + this(true, count, renderers, null); + } + + /** + * Non showcase + */ + public CompoundFavoriteRenderer(int count, IntFunction<Renderer> renderers, IntSupplier supplier) { + this(false, count, renderers, supplier); + } + + public CompoundFavoriteRenderer(boolean showcase, int count, IntFunction<Renderer> renderers, IntSupplier supplier) { + this.count = count; + this.showcase = showcase; + this.renderers = renderers; + this.supplier = supplier; + } + + @Override + public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { + updateAnimator(delta); + Vector4f vector4f = new Vector4f(bounds.x, bounds.y, 0, 1.0F); + vector4f.transform(matrices.last().pose()); + Vector4f vector4f2 = new Vector4f(bounds.getMaxX(), bounds.getMaxY(), 0, 1.0F); + vector4f2.transform(matrices.last().pose()); + scissorArea.setBounds((int) vector4f.x(), (int) vector4f.y(), (int) vector4f2.x() - (int) vector4f.x(), (int) vector4f2.y() - (int) vector4f.y()); + ScissorsHandler.INSTANCE.scissor(scissorArea); + matrices.pushPose(); + matrices.translate(0, this.offset.floatValue() * -bounds.getHeight(), 0); + for (int i = 0; i < count; i++) { + renderers.apply(i).render(matrices, bounds, mouseX, mouseY, delta); + matrices.translate(0, bounds.height, 0); + } + matrices.popPose(); + ScissorsHandler.INSTANCE.removeLastScissor(); + } + + private void updateAnimator(float delta) { + offset.update(delta); + if (showcase) { + if (nextSwitch == -1) { + nextSwitch = Util.getMillis(); + } + if (Util.getMillis() - nextSwitch > 1000) { + nextSwitch = Util.getMillis(); + offset.setTo(((int) offset.target() + 1) % count, 500); + } + } else { + offset.setTo(supplier.getAsInt() % count, 500); + } + } +} |
