diff options
16 files changed, 107 insertions, 32 deletions
diff --git a/api/build.gradle b/api/build.gradle index 3a332c299..44fe15010 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -5,7 +5,7 @@ dependencies { } architectury { - common() + common(forgeEnabled.toBoolean()) } remapJar { diff --git a/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/BatchEntryRenderer.java b/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/BatchedEntryRenderer.java index ba7e5d150..400ef727c 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/BatchEntryRenderer.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/BatchedEntryRenderer.java @@ -29,28 +29,54 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; -public interface BatchEntryRenderer<T> extends EntryRenderer<T> { - static <T> int getBatchIdFrom(EntryStack<T> entry) { - EntryRenderer<T> renderer = entry.getRenderer(); - if (renderer instanceof BatchEntryRenderer) return ((BatchEntryRenderer<T>) renderer).getBatchId(entry); - return renderer.getClass().hashCode(); +public interface BatchedEntryRenderer<T> extends EntryRenderer<T> { + /** + * Returns a batch identifier, stacks with the same batch identifier will be grouped together + * into a batch. + * + * @param entry the stack + * @param bounds the bounds of the entry + * @return the batch identifier + */ + default int getBatchIdentifier(EntryStack<T> entry, Rectangle bounds) { + return getClass().hashCode(); } - default int getBatchId(EntryStack<T> entry) { - return getClass().hashCode(); + /** + * Modifies the {@link PoseStack} passed tp various batch rendering methods. + * + * @param matrices the matrix stack + * @return the modified matrix stack, could be an entirely different stack + */ + default PoseStack batchModifyMatrices(PoseStack matrices) { + return matrices; } + /** + * Starts the batch rendering, used to setup states, only called once with every batch. + * + * @param entry the first entry in the batch + * @param matrices the matrix stack + * @param delta the tick delta + */ void startBatch(EntryStack<T> entry, PoseStack matrices, float delta); void renderBase(EntryStack<T> entry, PoseStack matrices, MultiBufferSource.BufferSource immediate, Rectangle bounds, int mouseX, int mouseY, float delta); void renderOverlay(EntryStack<T> entry, PoseStack matrices, MultiBufferSource.BufferSource immediate, Rectangle bounds, int mouseX, int mouseY, float delta); + /** + * Ends the batch rendering, used to setup states, only called once with every batch. + * + * @param entry the first entry in the batch + * @param matrices the matrix stack + * @param delta the tick delta + */ void endBatch(EntryStack<T> entry, PoseStack matrices, float delta); - @Deprecated @Override default void render(EntryStack<T> entry, PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { + matrices = batchModifyMatrices(matrices); startBatch(entry, matrices, delta); MultiBufferSource.BufferSource immediate = Minecraft.getInstance().renderBuffers().bufferSource(); renderBase(entry, matrices, immediate, bounds, mouseX, mouseY, delta); diff --git a/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java b/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java index 9ee60c5f8..e5b78b788 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java @@ -34,6 +34,13 @@ import net.fabricmc.api.Environment; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +/** + * A renderer to render a {@link EntryStack}. + * Use {@link me.shedaniel.rei.api.client.util.ClientEntryStacks#setRenderer} to change the {@link EntryRenderer} for a {@link EntryStack}. + * + * @param <T> the entry type + * @see BatchedEntryRenderer + */ public interface EntryRenderer<T> { static <T> EntryRenderer<T> empty() { return ClientInternals.getEmptyEntryRenderer(); diff --git a/build.gradle b/build.gradle index b82f547f9..4cbfbd082 100755 --- a/build.gradle +++ b/build.gradle @@ -148,7 +148,9 @@ task releaseOnCf { } proc.waitFor() releaseChangelog = changes.toString() - dependsOn project("forge").tasks.getByName("curseforge") + if (subprojects.any { it.name == "forge" }) { + dependsOn project("forge").tasks.getByName("curseforge") + } } /*project { diff --git a/gradle.properties b/gradle.properties index 4e9ed76c7..50ac8bcac 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,6 +3,7 @@ base_version=6.0.0 unstable=true supported_version=1.16.2/3/4/5 minecraft_version=1.16.5 +forgeEnabled=true forge_version=36.0.43 fabricloader_version=0.11.1 cloth_config_version=4.11.18 diff --git a/runtime/build.gradle b/runtime/build.gradle index 53c1100d7..3048fb3b7 100644 --- a/runtime/build.gradle +++ b/runtime/build.gradle @@ -1,5 +1,5 @@ architectury { - common() + common(forgeEnabled.toBoolean()) } repositories { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java index 7a6e9f32d..9717f1cf1 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java @@ -46,7 +46,7 @@ import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; -import me.shedaniel.rei.impl.client.gui.widget.BatchEntryRendererManager; +import me.shedaniel.rei.impl.client.gui.widget.BatchedEntryRendererManager; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import net.minecraft.client.Minecraft; @@ -222,7 +222,7 @@ public class FilteringScreen extends Screen { int skip = Math.max(0, Mth.floor(scrolling.scrollAmount / (float) entrySize())); int nextIndex = skip * innerBounds.width / entrySize(); int i = nextIndex; - BatchEntryRendererManager manager = new BatchEntryRendererManager(); + BatchedEntryRendererManager manager = new BatchedEntryRendererManager(); for (; i < entryStacks.size(); i++) { EntryStack<?> stack = entryStacks.get(i); EntryListEntry entry = entries.get(nextIndex); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchEntryRendererManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java index 6cafecb90..a410a24a3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchEntryRendererManager.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java @@ -28,7 +28,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import me.shedaniel.rei.api.client.config.ConfigObject; -import me.shedaniel.rei.api.client.entry.renderer.BatchEntryRenderer; +import me.shedaniel.rei.api.client.entry.renderer.BatchedEntryRenderer; import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.common.entry.EntryStack; import net.minecraft.client.Minecraft; @@ -40,15 +40,15 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -public class BatchEntryRendererManager { +public class BatchedEntryRendererManager { private boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); private Int2ObjectMap<List<EntryWidget>> grouping = new Int2ObjectOpenHashMap<>(); private List<EntryWidget> toRender = new ArrayList<>(); - public BatchEntryRendererManager() { + public BatchedEntryRendererManager() { } - public BatchEntryRendererManager(Collection<? extends EntryWidget> widgets) { + public BatchedEntryRendererManager(Collection<? extends EntryWidget> widgets) { addAll(widgets); } @@ -66,8 +66,8 @@ public class BatchEntryRendererManager { if (fastEntryRendering) { EntryStack<?> currentEntry = widget.getCurrentEntry(); EntryRenderer<?> renderer = currentEntry.getRenderer(); - if (renderer instanceof BatchEntryRenderer) { - int hash = ((BatchEntryRenderer<Object>) renderer).getBatchId(currentEntry.cast()); + if (renderer instanceof BatchedEntryRenderer) { + int hash = ((BatchedEntryRenderer<Object>) renderer).getBatchIdentifier(currentEntry.cast(), widget.getBounds()); List<EntryWidget> entries = grouping.get(hash); if (entries == null) { grouping.put(hash, entries = new ArrayList<>()); @@ -101,8 +101,9 @@ public class BatchEntryRendererManager { @SuppressWarnings("rawtypes") EntryStack first = firstWidget.getCurrentEntry(); EntryRenderer<?> renderer = first.getRenderer(); - if (fastEntryRendering && renderer instanceof BatchEntryRenderer) { - BatchEntryRenderer<?> firstRenderer = (BatchEntryRenderer<?>) renderer; + if (fastEntryRendering && renderer instanceof BatchedEntryRenderer) { + BatchedEntryRenderer<?> firstRenderer = (BatchedEntryRenderer<?>) renderer; + matrices = firstRenderer.batchModifyMatrices(matrices); firstRenderer.startBatch(first, matrices, delta); long l = debugTime ? System.nanoTime() : 0; MultiBufferSource.BufferSource immediate = Minecraft.getInstance().renderBuffers().bufferSource(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java index ec57bf1d1..44e0589d9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java @@ -220,7 +220,7 @@ public class EntryListWidget extends WidgetWithBounds { int skip = Math.max(0, Mth.floor(scrolling.scrollAmount / (float) entrySize())); int nextIndex = skip * innerBounds.width / entrySize(); this.blockedCount = 0; - BatchEntryRendererManager helper = new BatchEntryRendererManager(); + BatchedEntryRendererManager helper = new BatchedEntryRendererManager(); int i = nextIndex; for (int cont = nextIndex; cont < entries.size(); cont++) { @@ -253,7 +253,7 @@ public class EntryListWidget extends WidgetWithBounds { for (Widget widget : renders) { widget.render(matrices, mouseX, mouseY, delta); } - new BatchEntryRendererManager(entries).render(debugTime, size, time, matrices, mouseX, mouseY, delta); + new BatchedEntryRendererManager(entries).render(debugTime, size, time, matrices, mouseX, mouseY, delta); } if (debugTime) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java index 57ccd0b6a..1433c65de 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java @@ -251,7 +251,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt Stream<EntryListEntry> entryStream = this.entriesList.stream() .filter(entry -> entry.getBounds().getMaxY() >= this.currentBounds.getY() && entry.getBounds().y <= this.currentBounds.getMaxY()); - new BatchEntryRendererManager(entryStream.collect(Collectors.toList())) + new BatchedEntryRendererManager(entryStream.collect(Collectors.toList())) .render(matrices, mouseX, mouseY, delta); updatePosition(delta); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchFieldSyntaxHighlighter.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchFieldSyntaxHighlighter.java index 42308f678..0af21de72 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchFieldSyntaxHighlighter.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchFieldSyntaxHighlighter.java @@ -23,9 +23,9 @@ package me.shedaniel.rei.impl.client.gui.widget.search; +import me.shedaniel.rei.impl.client.search.IntRange; import me.shedaniel.rei.impl.client.search.argument.Argument; import me.shedaniel.rei.impl.client.search.argument.type.ArgumentTypesRegistry; -import net.minecraft.util.IntRange; import org.jetbrains.annotations.ApiStatus; import java.util.Collection; @@ -63,7 +63,7 @@ public class OverlaySearchFieldSyntaxHighlighter implements Consumer<String> { highlighted[i] = (byte) argIndex; } for (IntRange grammarRange : grammarRanges) { - for (int i = grammarRange.getMinInclusive(); i <= grammarRange.getMaxInclusive(); i++) { + for (int i = grammarRange.min(); i <= grammarRange.max(); i++) { highlighted[i + index] = (byte) (argIndex + 1); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/IntRange.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/IntRange.java new file mode 100644 index 000000000..05c5e1ca4 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/IntRange.java @@ -0,0 +1,38 @@ +package me.shedaniel.rei.impl.client.search; + +import java.util.Objects; + +public class IntRange { + private final int min; + private final int max; + + private IntRange(int min, int max) { + this.min = min; + this.max = max; + } + + public static IntRange of(int min, int max) { + return new IntRange(min, max); + } + + public int min() { + return min; + } + + public int max() { + return max; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + IntRange intRange = (IntRange) o; + return min == intRange.min && max == intRange.max; + } + + @Override + public int hashCode() { + return Objects.hash(min, max); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java index 67520b666..dcabfbdf2 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java @@ -27,13 +27,13 @@ import com.google.common.base.MoreObjects; import com.google.common.collect.Lists; import me.shedaniel.rei.api.client.gui.config.SearchMode; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.impl.client.search.IntRange; import me.shedaniel.rei.impl.client.search.argument.type.AlwaysMatchingArgumentType; import me.shedaniel.rei.impl.client.search.argument.type.ArgumentType; import me.shedaniel.rei.impl.client.search.argument.type.ArgumentTypesRegistry; import me.shedaniel.rei.impl.client.search.result.ArgumentApplicableResult; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.util.IntRange; import net.minecraft.util.Unit; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.mutable.Mutable; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/result/ArgumentApplicableResult.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/result/ArgumentApplicableResult.java index e25b89326..3014c9771 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/result/ArgumentApplicableResult.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/result/ArgumentApplicableResult.java @@ -23,8 +23,8 @@ package me.shedaniel.rei.impl.client.search.result; +import me.shedaniel.rei.impl.client.search.IntRange; import me.shedaniel.rei.impl.client.search.argument.type.MatchType; -import net.minecraft.util.IntRange; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java index 618674152..3cbf8d511 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java @@ -154,7 +154,7 @@ public abstract class AbstractEntryStack<A> extends AbstractRenderer implements @Override @Nullable public Tooltip getTooltip(Point mouse, boolean appendModName) { - Mutable<Tooltip> tooltip = new MutableObject<>(this.get(Settings.RENDER).apply(this).<A>cast().getTooltip(this, mouse)); + Mutable<Tooltip> tooltip = new MutableObject<>(this.get(Settings.RENDERER).apply(this).<A>cast().getTooltip(this, mouse)); if (tooltip.getValue() == null) return null; tooltip.getValue().getText().addAll(get(EntryStack.Settings.TOOLTIP_APPEND_EXTRA).apply(this)); tooltip.setValue(get(Settings.TOOLTIP_PROCESSOR).apply(this, tooltip.getValue())); diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java index 453df00c3..a6a102ea8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java @@ -33,7 +33,7 @@ import it.unimi.dsi.fastutil.objects.ReferenceSet; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.entry.renderer.AbstractEntryRenderer; -import me.shedaniel.rei.api.client.entry.renderer.BatchEntryRenderer; +import me.shedaniel.rei.api.client.entry.renderer.BatchedEntryRenderer; import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.common.entry.EntrySerializer; @@ -185,9 +185,9 @@ public class ItemEntryDefinition implements EntryDefinition<ItemStack>, EntrySer } @SuppressWarnings("deprecation") - public class ItemEntryRenderer extends AbstractEntryRenderer<ItemStack> implements BatchEntryRenderer<ItemStack> { + public class ItemEntryRenderer extends AbstractEntryRenderer<ItemStack> implements BatchedEntryRenderer<ItemStack> { @Override - public int getBatchId(EntryStack<ItemStack> entry) { + public int getBatchIdentifier(EntryStack<ItemStack> entry, Rectangle bounds) { return 1738923 + (getModelFromStack(entry.getValue()).usesBlockLight() ? 1 : 0); } |
