diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-03-09 21:30:12 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-03-09 21:30:12 +0800 |
| commit | 64bc9937d6ec04c6d66240a84b4fb345026c0b12 (patch) | |
| tree | 62e055c5cc64875300bdf69ac9a4400fb4b28dd9 /api/src/main/java | |
| parent | 69d386214f5d3471a3ef1e5533037cdc32648c57 (diff) | |
| download | RoughlyEnoughItems-64bc9937d6ec04c6d66240a84b4fb345026c0b12.tar.gz RoughlyEnoughItems-64bc9937d6ec04c6d66240a84b4fb345026c0b12.tar.bz2 RoughlyEnoughItems-64bc9937d6ec04c6d66240a84b4fb345026c0b12.zip | |
Very primitive background rendering for JEI plugins
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'api/src/main/java')
12 files changed, 129 insertions, 8 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/REIOverlay.java b/api/src/main/java/me/shedaniel/rei/api/REIOverlay.java index 24eaf15bd..c9dc4c16e 100644 --- a/api/src/main/java/me/shedaniel/rei/api/REIOverlay.java +++ b/api/src/main/java/me/shedaniel/rei/api/REIOverlay.java @@ -23,9 +23,12 @@ package me.shedaniel.rei.api; +import me.shedaniel.rei.api.gui.drag.DraggingContext; import org.jetbrains.annotations.ApiStatus; @ApiStatus.Experimental public interface REIOverlay { void queueReloadOverlay(); + + DraggingContext getDraggingContext(); } diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStack.java b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStack.java new file mode 100644 index 000000000..8d38fb4c8 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStack.java @@ -0,0 +1,17 @@ +package me.shedaniel.rei.api.gui.drag; + +import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.ingredient.EntryStack; + +public interface DraggableStack { + EntryStack<?> getStack(); + + void drag(); + + void release(boolean accepted); + + default void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { + getStack().render(matrices, bounds, mouseX, mouseY, delta); + } +}
\ No newline at end of file diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackProvider.java b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackProvider.java new file mode 100644 index 000000000..7b799b26a --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackProvider.java @@ -0,0 +1,21 @@ +package me.shedaniel.rei.api.gui.drag; + +import org.jetbrains.annotations.Nullable; + +import java.util.function.Supplier; + +@FunctionalInterface +public interface DraggableStackProvider { + static DraggableStackProvider from(Supplier<Iterable<DraggableStackProvider>> providers) { + return (context, mouseX, mouseY) -> { + for (DraggableStackProvider provider : providers.get()) { + DraggableStack stack = provider.getHoveredStack(context, mouseX, mouseY); + if (stack != null) return stack; + } + return null; + }; + } + + @Nullable + DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY); +}
\ No newline at end of file diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackVisitor.java b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackVisitor.java new file mode 100644 index 000000000..e0e64bf9a --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackVisitor.java @@ -0,0 +1,23 @@ +package me.shedaniel.rei.api.gui.drag; + +import java.util.Optional; +import java.util.function.Supplier; + +@FunctionalInterface +public interface DraggableStackVisitor { + static DraggableStackVisitor from(Supplier<Iterable<DraggableStackVisitor>> visitors) { + return (stack) -> { + for (DraggableStackVisitor visitor : visitors.get()) { + Optional<Acceptor> acceptor = visitor.visitDraggedStack(stack); + if (acceptor.isPresent()) return acceptor; + } + return Optional.empty(); + }; + } + + Optional<Acceptor> visitDraggedStack(DraggableStack stack); + + interface Acceptor { + void accept(DraggableStack stack); + } +} diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggingContext.java b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggingContext.java new file mode 100644 index 000000000..cd9bc3a32 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggingContext.java @@ -0,0 +1,25 @@ +package me.shedaniel.rei.api.gui.drag; + +import me.shedaniel.math.Point; +import me.shedaniel.rei.api.REIHelper; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Supplier; + +public interface DraggingContext { + static DraggingContext getInstance() { + return REIHelper.getInstance().getOverlay().get().getDraggingContext(); + } + + default boolean isDraggingStack() { + return getCurrentStack() != null; + } + + @Nullable + DraggableStack getCurrentStack(); + + @Nullable + Point getCurrentPosition(); + + void registerRenderBackToPosition(DraggableStack stack, Supplier<Point> position); +} diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widget.java b/api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widget.java index abe4454ae..ddb4d0d26 100644 --- a/api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widget.java +++ b/api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widget.java @@ -75,6 +75,7 @@ public abstract class Widget extends AbstractContainerEventHandler implements ne } @Override + @Deprecated public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { render(matrices, mouseX, mouseY, delta); } diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/widgets/WidgetWithBounds.java b/api/src/main/java/me/shedaniel/rei/api/gui/widgets/WidgetWithBounds.java index 17b178bb3..b427d8a47 100644 --- a/api/src/main/java/me/shedaniel/rei/api/gui/widgets/WidgetWithBounds.java +++ b/api/src/main/java/me/shedaniel/rei/api/gui/widgets/WidgetWithBounds.java @@ -27,7 +27,6 @@ import me.shedaniel.math.Rectangle; import org.jetbrains.annotations.NotNull; public abstract class WidgetWithBounds extends Widget { - @NotNull public abstract Rectangle getBounds(); @@ -35,5 +34,4 @@ public abstract class WidgetWithBounds extends Widget { public boolean containsMouse(double mouseX, double mouseY) { return getBounds().contains(mouseX, mouseY); } - } diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java index 913dded0d..9e62eb9a1 100644 --- a/api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java +++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java @@ -29,11 +29,11 @@ import com.mojang.serialization.Dynamic; import com.mojang.serialization.JsonOps; import me.shedaniel.architectury.utils.Fraction; import me.shedaniel.rei.api.gui.Renderer; -import me.shedaniel.rei.api.util.TextRepresentable; import me.shedaniel.rei.api.ingredient.entry.ComparisonContext; import me.shedaniel.rei.api.ingredient.entry.EntryDefinition; import me.shedaniel.rei.api.ingredient.entry.EntryRenderer; import me.shedaniel.rei.api.ingredient.entry.EntryType; +import me.shedaniel.rei.api.util.TextRepresentable; import me.shedaniel.rei.impl.Internals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -202,4 +202,9 @@ public interface EntryStack<T> extends TextRepresentable, Renderer { setAmount(getAmount().simplify()); return this; } + + @ApiStatus.NonExtendable + default <O> EntryStack<O> cast() { + return (EntryStack<O>) this; + } } diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java index dcb72f0fe..f2d22668f 100644 --- a/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java +++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java @@ -49,7 +49,6 @@ public interface EntryDefinition<T> { boolean isEmpty(EntryStack<T> entry, T value); - @NotNull T copy(EntryStack<T> entry, T value); int hash(EntryStack<T> entry, T value, ComparisonContext context); diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java index 2fd9f0bbb..2397b46a5 100644 --- a/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java +++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java @@ -25,11 +25,11 @@ package me.shedaniel.rei.api.ingredient.entry; import me.shedaniel.rei.api.plugins.PluginManager; import me.shedaniel.rei.api.registry.Reloadable; -import me.shedaniel.rei.impl.Internals; import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Set; + public interface EntryTypeRegistry extends Reloadable { static EntryTypeRegistry getInstance() { return PluginManager.getInstance().get(EntryTypeRegistry.class); @@ -75,6 +75,10 @@ public interface EntryTypeRegistry extends Reloadable { @Nullable EntryDefinition<?> get(ResourceLocation id); + Set<ResourceLocation> keySet(); + + Set<EntryDefinition<?>> values(); + <A, B> void registerBridge(EntryType<A> original, EntryType<B> destination, EntryTypeBridge<A, B> bridge); <A, B> Iterable<EntryTypeBridge<A, B>> getBridgesFor(EntryType<A> original, EntryType<B> destination); diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryIngredients.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryIngredients.java index 0407ae215..bbd401247 100644 --- a/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryIngredients.java +++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryIngredients.java @@ -24,10 +24,13 @@ package me.shedaniel.rei.api.ingredient.util; import com.google.common.collect.ImmutableList; +import me.shedaniel.architectury.fluid.FluidStack; import me.shedaniel.architectury.utils.Fraction; import me.shedaniel.rei.api.gui.Renderer; import me.shedaniel.rei.api.ingredient.EntryIngredient; import me.shedaniel.rei.api.ingredient.EntryStack; +import me.shedaniel.rei.api.ingredient.entry.EntryDefinition; +import me.shedaniel.rei.api.ingredient.entry.EntryType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; @@ -65,10 +68,28 @@ public final class EntryIngredients { return EntryIngredient.of(EntryStacks.of(fluid, amount)); } + public static EntryIngredient of(FluidStack stack) { + return EntryIngredient.of(EntryStacks.of(stack)); + } + public static EntryIngredient of(Renderer renderer) { return EntryIngredient.of(EntryStacks.of(renderer)); } + public static <T> EntryIngredient of(EntryType<T> type, Collection<T> values) { + return of(type.getDefinition(), values); + } + + public static <T> EntryIngredient of(EntryDefinition<T> definition, Collection<T> values) { + if (values.size() == 0) return EntryIngredient.empty(); + if (values.size() == 1) return EntryIngredient.of(EntryStack.of(definition, values.iterator().next())); + List<EntryStack<T>> result = new ArrayList<>(values.size()); + for (T value : values) { + result.add(EntryStack.of(definition, value)); + } + return EntryIngredient.of(result); + } + public static EntryIngredient ofItems(Collection<ItemLike> stacks) { if (stacks.size() == 0) return EntryIngredient.empty(); if (stacks.size() == 1) return EntryIngredient.of(EntryStacks.of(stacks.iterator().next())); diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java index 18144e5df..30b6af005 100644 --- a/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java +++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java @@ -26,9 +26,9 @@ package me.shedaniel.rei.api.ingredient.util; import com.google.common.collect.ImmutableList; import me.shedaniel.architectury.fluid.FluidStack; import me.shedaniel.architectury.utils.Fraction; +import me.shedaniel.rei.api.gui.Renderer; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.ingredient.entry.*; -import me.shedaniel.rei.api.gui.Renderer; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -57,6 +57,10 @@ public final class EntryStacks { return EntryStack.of(VanillaEntryTypes.FLUID, FluidStack.create(fluid, amount)); } + public static EntryStack<FluidStack> of(FluidStack stack) { + return EntryStack.of(VanillaEntryTypes.FLUID, stack); + } + public static EntryStack<ItemStack> of(ItemStack stack) { return EntryStack.of(VanillaEntryTypes.ITEM, stack); } @@ -67,7 +71,7 @@ public final class EntryStacks { public static EntryStack<?> of(Renderer renderer) { if (renderer instanceof EntryStack) { - return (EntryStack<Renderer>) renderer; + return (EntryStack<?>) renderer; } return EntryStack.of(BuiltinEntryTypes.RENDERING, renderer); |
