From 513347f841a401391f59b4c9fe3cbcb4f554f86d Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 12 Apr 2021 00:36:08 +0800 Subject: Prepare for true sided REI Signed-off-by: shedaniel --- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 32 +++++++++++++++++----- .../entry/type/types/RenderingEntryDefinition.java | 2 +- .../impl/common/entry/type/EntryRegistryImpl.java | 1 + .../entry/type/types/BuiltinEntryDefinition.java | 12 ++++++-- .../entry/type/types/EmptyEntryDefinition.java | 9 +++--- .../rei/impl/common/plugins/PluginManagerImpl.java | 5 ---- .../plugin/client/entry/FluidEntryDefinition.java | 13 ++++++++- .../plugin/client/entry/ItemEntryDefinition.java | 13 ++++++++- 8 files changed, 65 insertions(+), 22 deletions(-) (limited to 'runtime/src') diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index f0a392e65..0ed0e6f78 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -29,6 +29,7 @@ import me.shedaniel.architectury.event.events.RecipeUpdateEvent; import me.shedaniel.architectury.event.events.client.ClientScreenInputEvent; import me.shedaniel.architectury.networking.NetworkManager; import me.shedaniel.architectury.platform.Platform; +import me.shedaniel.architectury.registry.ReloadListeners; import me.shedaniel.architectury.utils.Env; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.REIHelper; @@ -111,6 +112,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; import net.minecraft.util.Unit; import net.minecraft.world.InteractionResult; import net.minecraft.world.inventory.CraftingMenu; @@ -137,14 +139,19 @@ import java.util.stream.Collectors; import java.util.stream.Stream; @ApiStatus.Internal -@Environment(EnvType.CLIENT) public class RoughlyEnoughItemsCore { - @ApiStatus.Internal public static final Logger LOGGER = LogManager.getFormatterLogger("REI"); - private static final ExecutorService SYNC_RECIPES = Executors.newSingleThreadScheduledExecutor(r -> new Thread(r, "REI-SyncRecipes")); + @ApiStatus.Internal + public static final Logger LOGGER = LogManager.getFormatterLogger("REI"); + private static final ExecutorService RELOAD_PLUGINS; @ApiStatus.Experimental public static boolean isLeftMousePressed = false; static { + RELOAD_PLUGINS = Executors.newSingleThreadScheduledExecutor(r -> { + Thread thread = new Thread(r, "REI-ReloadPlugins"); + thread.setDaemon(true); + return thread; + }); attachCommonInternals(); if (Platform.getEnvironment() == Env.CLIENT) { attachClientInternals(); @@ -255,7 +262,8 @@ public class RoughlyEnoughItemsCore { @Environment(EnvType.CLIENT) public static void attachClientInternals() { InternalWidgets.attach(); - ClientInternals.attachInstance((Supplier>) () -> EmptyEntryDefinition.EmptyRenderer.INSTANCE, "emptyEntryRenderer"); + EmptyEntryDefinition.EmptyRenderer emptyEntryRenderer = new EmptyEntryDefinition.EmptyRenderer(); + ClientInternals.attachInstance((Supplier>) () -> emptyEntryRenderer, "emptyEntryRenderer"); ClientInternals.attachInstance((BiFunction, Supplier, FavoriteEntry>) (supplier, toJson) -> new FavoriteEntry() { FavoriteEntry value = null; @@ -383,6 +391,7 @@ public class RoughlyEnoughItemsCore { } @ApiStatus.Internal + @Environment(EnvType.CLIENT) public static void reloadPlugins(MutableLong lastReload) { if (lastReload != null) { if (lastReload.getValue() > 0 && System.currentTimeMillis() - lastReload.getValue() <= 5000) { @@ -392,7 +401,7 @@ public class RoughlyEnoughItemsCore { lastReload.setValue(System.currentTimeMillis()); } if (ConfigObject.getInstance().doesRegisterRecipesInAnotherThread()) { - CompletableFuture.runAsync(RoughlyEnoughItemsCore::_reloadPlugins, SYNC_RECIPES); + CompletableFuture.runAsync(RoughlyEnoughItemsCore::_reloadPlugins, RELOAD_PLUGINS); } else { _reloadPlugins(); } @@ -408,12 +417,21 @@ public class RoughlyEnoughItemsCore { PluginDetector.detectCommonPlugins(); PluginDetector.detectServerPlugins(); RoughlyEnoughItemsNetwork.onInitialize(); + + if (Platform.getEnvironment() == Env.SERVER) { + MutableLong lastReload = new MutableLong(-1); + ReloadListeners.registerReloadListener(PackType.SERVER_DATA, (preparationBarrier, resourceManager, profilerFiller, profilerFiller2, executor, executor2) -> { + return preparationBarrier.wait(Unit.INSTANCE).thenRunAsync(() -> { + CompletableFuture.runAsync(RoughlyEnoughItemsCore::_reloadPlugins, RELOAD_PLUGINS); + }, executor2); + }); + } } @Environment(EnvType.CLIENT) public void onInitializeClient() { IssuesDetector.detect(); - registerClothEvents(); + registerEvents(); PluginDetector.detectClientPlugins(); loadTestPlugins(); @@ -489,7 +507,7 @@ public class RoughlyEnoughItemsCore { } @Environment(EnvType.CLIENT) - private void registerClothEvents() { + private void registerEvents() { Minecraft client = Minecraft.getInstance(); final ResourceLocation recipeButtonTex = new ResourceLocation("textures/gui/recipe_button.png"); MutableLong lastReload = new MutableLong(-1); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java index e8dfa574f..ed0aaf717 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java @@ -43,7 +43,7 @@ import org.jetbrains.annotations.Nullable; @ApiStatus.Internal @Environment(EnvType.CLIENT) public class RenderingEntryDefinition { - public static final EntryDefinition RENDERING = new BuiltinEntryDefinition(Renderer.class, BuiltinClientEntryTypes.RENDERING, false, RenderingEntryDefinition::throwRendering, DeferredRenderer.INSTANCE) { + public static final EntryDefinition RENDERING = new BuiltinEntryDefinition(Renderer.class, BuiltinClientEntryTypes.RENDERING, false, RenderingEntryDefinition::throwRendering, () -> () -> DeferredRenderer.INSTANCE) { @Override public Component asFormattedText(EntryStack entry, Renderer value) { Tooltip tooltip = value.getTooltip(PointHelper.ofMouse()); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java index 0275db9a4..38a0403d7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java @@ -87,6 +87,7 @@ public class EntryRegistryImpl implements EntryRegistry { entries.clear(); entries.addAll(CollectionUtils.map(reloadingRegistry, HashedEntryStackWrapper::unwrap)); reloadingRegistry = null; + refilter(); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java index fb7590a82..48f5fc293 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java @@ -23,6 +23,8 @@ package me.shedaniel.rei.impl.common.entry.type.types; +import me.shedaniel.architectury.utils.Env; +import me.shedaniel.architectury.utils.EnvExecutor; import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.common.entry.EntrySerializer; import me.shedaniel.rei.api.common.entry.EntryStack; @@ -30,6 +32,8 @@ import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.EntryType; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -48,14 +52,15 @@ public class BuiltinEntryDefinition implements EntryDefinition, EntrySeria private final EntryType type; private final boolean empty; private final Supplier defaultValue; - private final EntryRenderer renderer; + @Environment(EnvType.CLIENT) + private EntryRenderer renderer; - protected BuiltinEntryDefinition(Class clazz, EntryType type, boolean empty, Supplier defaultValue, EntryRenderer renderer) { + protected BuiltinEntryDefinition(Class clazz, EntryType type, boolean empty, Supplier defaultValue, Supplier>> renderer) { this.clazz = clazz; this.type = type; this.empty = empty; this.defaultValue = defaultValue; - this.renderer = renderer; + EnvExecutor.runInEnv(Env.CLIENT, () -> () -> this.renderer = renderer.get().get()); } @Override @@ -69,6 +74,7 @@ public class BuiltinEntryDefinition implements EntryDefinition, EntrySeria } @Override + @Environment(EnvType.CLIENT) public EntryRenderer getRenderer() { return renderer; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java index 8c82b02d5..31a951bdc 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java @@ -31,17 +31,18 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.BuiltinEntryTypes; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.util.Unit; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @ApiStatus.Internal public class EmptyEntryDefinition { - public static final EntryDefinition EMPTY = new BuiltinEntryDefinition<>(Unit.class, BuiltinEntryTypes.EMPTY, true, () -> Unit.INSTANCE, EmptyRenderer.INSTANCE); + public static final EntryDefinition EMPTY = new BuiltinEntryDefinition<>(Unit.class, BuiltinEntryTypes.EMPTY, true, () -> Unit.INSTANCE, () -> () -> new EmptyRenderer()); - public enum EmptyRenderer implements EntryRenderer { - INSTANCE; - + @Environment(EnvType.CLIENT) + public static class EmptyRenderer implements EntryRenderer { @Override public void render(EntryStack entry, PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java index a9ac12590..d90ece572 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java @@ -49,7 +49,6 @@ import java.util.function.LongConsumer; import java.util.function.UnaryOperator; @ApiStatus.Internal -@Environment(EnvType.CLIENT) public class PluginManagerImpl

> implements PluginManager

, PluginView

{ private final List> reloadables = new ArrayList<>(); private final Map>, Reloadable> cache = new ConcurrentHashMap<>(); @@ -189,10 +188,6 @@ public class PluginManagerImpl

> implements PluginManager< } } - try (SectionClosable refilter = section(sectionData, "entry-registry-refilter")) { - EntryRegistry.getInstance().refilter(); - } - long usedTime = Util.getMillis() - startTime; reloadDoneListener.accept(usedTime); } catch (Throwable throwable) { diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java index d0d162777..eadb3f947 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java @@ -28,6 +28,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.architectury.fluid.FluidStack; import me.shedaniel.architectury.hooks.FluidStackHooks; import me.shedaniel.architectury.platform.Platform; +import me.shedaniel.architectury.utils.Env; +import me.shedaniel.architectury.utils.EnvExecutor; import me.shedaniel.architectury.utils.Fraction; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; @@ -42,6 +44,8 @@ import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.EntryType; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.EntryStacks; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; @@ -58,6 +62,7 @@ import net.minecraft.tags.TagCollection; import net.minecraft.tags.TagContainer; import net.minecraft.util.Mth; import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.material.Fluid; import org.jetbrains.annotations.Nullable; @@ -70,7 +75,12 @@ import java.util.stream.Stream; public class FluidEntryDefinition implements EntryDefinition, EntrySerializer { private static final String FLUID_AMOUNT = Platform.isForge() ? "tooltip.rei.fluid_amount.forge" : "tooltip.rei.fluid_amount"; - private final EntryRenderer renderer = new FluidEntryRenderer(); + @Environment(EnvType.CLIENT) + private EntryRenderer renderer; + + public FluidEntryDefinition() { + EnvExecutor.runInEnv(Env.CLIENT, () -> () -> renderer = new FluidEntryRenderer()); + } @Override public Class getValueType() { @@ -83,6 +93,7 @@ public class FluidEntryDefinition implements EntryDefinition, EntryS } @Override + @Environment(EnvType.CLIENT) public EntryRenderer getRenderer() { return renderer; } 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 a6a102ea8..d3c666b68 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 @@ -30,6 +30,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import it.unimi.dsi.fastutil.objects.ReferenceSet; +import me.shedaniel.architectury.utils.Env; +import me.shedaniel.architectury.utils.EnvExecutor; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.entry.renderer.AbstractEntryRenderer; @@ -44,6 +46,8 @@ import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.EntryType; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms; @@ -67,7 +71,12 @@ import java.util.Collections; import java.util.List; public class ItemEntryDefinition implements EntryDefinition, EntrySerializer { - private final EntryRenderer renderer = new ItemEntryRenderer(); + @Environment(EnvType.CLIENT) + private EntryRenderer renderer; + + public ItemEntryDefinition() { + EnvExecutor.runInEnv(Env.CLIENT, () -> () -> renderer = new ItemEntryRenderer()); + } @Override public Class getValueType() { @@ -80,6 +89,7 @@ public class ItemEntryDefinition implements EntryDefinition, EntrySer } @Override + @Environment(EnvType.CLIENT) public EntryRenderer getRenderer() { return renderer; } @@ -185,6 +195,7 @@ public class ItemEntryDefinition implements EntryDefinition, EntrySer } @SuppressWarnings("deprecation") + @Environment(EnvType.CLIENT) public class ItemEntryRenderer extends AbstractEntryRenderer implements BatchedEntryRenderer { @Override public int getBatchIdentifier(EntryStack entry, Rectangle bounds) { -- cgit From 5467c2f08da6f3c6dae7ae603e3708d4f6eb1638 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 12 Apr 2021 21:30:18 +0800 Subject: Fix #502 and Fix #499 Signed-off-by: shedaniel --- .../rei/impl/client/registry/category/CategoryRegistryImpl.java | 2 +- .../rei/impl/client/registry/display/DisplayRegistryImpl.java | 4 ++-- .../src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java | 4 ++-- .../me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java | 7 ++++++- 4 files changed, 11 insertions(+), 6 deletions(-) (limited to 'runtime/src') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.java index 3fac9255f..f2acf7bdc 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.java @@ -67,7 +67,7 @@ public class CategoryRegistryImpl implements CategoryRegistry { } @Override - public void register(DisplayCategory category, Consumer> configurator) { + public void add(DisplayCategory category, Consumer> configurator) { Configuration configuration = new Configuration<>(category); this.categories.put(category.getCategoryIdentifier(), configuration); configurator.accept(configuration); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java index 04f44839f..c08e2ac38 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java @@ -65,7 +65,7 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl new ArrayList<>()) .add(display); displayCount.increment(); @@ -78,7 +78,7 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl, List> getAllDisplays() { + public Map, List> getAll() { return Collections.unmodifiableMap(displays); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java index fe0fd0453..31a667a34 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java @@ -60,7 +60,7 @@ public class ViewsImpl implements Views { for (CategoryRegistry.CategoryConfiguration categoryConfiguration : CategoryRegistry.getInstance()) { DisplayCategory category = categoryConfiguration.getCategory(); CategoryIdentifier categoryId = categoryConfiguration.getCategoryIdentifier(); - List allRecipesFromCategory = DisplayRegistry.getInstance().getDisplays((CategoryIdentifier) categoryId); + List allRecipesFromCategory = DisplayRegistry.getInstance().get((CategoryIdentifier) categoryId); Set set = Sets.newLinkedHashSet(); if (categories.contains(categoryId)) { @@ -184,7 +184,7 @@ public class ViewsImpl implements Views { @Override public Collection> findCraftableEntriesByMaterials(Iterable> inventoryItems) { Set> craftables = new HashSet<>(); - for (List displays : DisplayRegistry.getInstance().getAllDisplays().values()) { + for (List displays : DisplayRegistry.getInstance().getAll().values()) { for (Display display : displays) { int slotsCraftable = 0; List requiredInput = display.getRequiredEntries(); diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java index eadb3f947..9344eb9e8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java @@ -212,7 +212,7 @@ public class FluidEntryDefinition implements EntryDefinition, EntryS List toolTip = Lists.newArrayList(entry.asFormattedText()); Fraction amount = entry.getValue().getAmount(); if (!amount.isLessThan(Fraction.zero())) { - String amountTooltip = I18n.get(FLUID_AMOUNT, EntryStacks.simplifyAmount(entry).getValue().getAmount()); + String amountTooltip = I18n.get(FLUID_AMOUNT, simplifyAmount(entry).getValue().getAmount()); if (amountTooltip != null) { toolTip.addAll(Stream.of(amountTooltip.split("\n")).map(TextComponent::new).collect(Collectors.toList())); } @@ -224,4 +224,9 @@ public class FluidEntryDefinition implements EntryDefinition, EntryS return Tooltip.create(toolTip); } } + + public static EntryStack simplifyAmount(EntryStack stack) { + stack.getValue().setAmount(stack.getValue().getAmount().simplify()); + return stack; + } } -- cgit From d892547a9b8a8ae85655900c08b6cc97c6aa2050 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Wed, 14 Apr 2021 17:33:29 +0800 Subject: Pass the BakedModel as an extra data Signed-off-by: shedaniel --- .../gui/widget/BatchedEntryRendererManager.java | 115 +++++++++++++-------- .../plugin/client/entry/ItemEntryDefinition.java | 27 ++--- 2 files changed, 85 insertions(+), 57 deletions(-) (limited to 'runtime/src') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java index a410a24a3..28bccb49b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java @@ -67,13 +67,17 @@ public class BatchedEntryRendererManager { EntryStack currentEntry = widget.getCurrentEntry(); EntryRenderer renderer = currentEntry.getRenderer(); if (renderer instanceof BatchedEntryRenderer) { - int hash = ((BatchedEntryRenderer) renderer).getBatchIdentifier(currentEntry.cast(), widget.getBounds()); - List entries = grouping.get(hash); - if (entries == null) { - grouping.put(hash, entries = new ArrayList<>()); + BatchedEntryRenderer batchedRenderer = (BatchedEntryRenderer) renderer; + EntryStack cast = currentEntry.cast(); + if (batchedRenderer.isBatched(cast)) { + int hash = batchedRenderer.getBatchIdentifier(cast, widget.getBounds(), batchedRenderer.getExtraData(cast)); + List entries = grouping.get(hash); + if (entries == null) { + grouping.put(hash, entries = new ArrayList<>()); + } + entries.add(widget); + return; } - entries.add(widget); - return; } } toRender.add(widget); @@ -90,55 +94,76 @@ public class BatchedEntryRendererManager { } } if (!toRender.isEmpty()) { - renderEntries(debugTime, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, toRender); + renderSlow(debugTime, size, time, matrices, mouseX, mouseY, delta, toRender); } } + public static void renderEntries(boolean debugTime, MutableInt size, MutableLong time, boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta, Collection entries) { + if (fastEntryRendering) { + T firstWidget = Iterables.getFirst(entries, null); + if (firstWidget == null) return; + EntryRenderer renderer = firstWidget.getCurrentEntry().getRenderer(); + if (renderer instanceof BatchedEntryRenderer) { + BatchedEntryRenderer firstRenderer = (BatchedEntryRenderer) renderer; + Object[] extraData = new Object[entries.size()]; + int i = 0; + for (T entry : entries) { + EntryStack currentEntry = entry.getCurrentEntry(); + extraData[i++] = ((BatchedEntryRenderer) currentEntry.getRenderer()).getExtraData(currentEntry.cast()); + } + renderBatched(debugTime, size, time, matrices, mouseX, mouseY, delta, entries, extraData); + return; + } + } + renderSlow(debugTime, size, time, matrices, mouseX, mouseY, delta, entries); + } - public static void renderEntries(boolean debugTime, MutableInt size, MutableLong time, boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable entries) { + private static void renderBatched(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable entries, Object[] extraData) { T firstWidget = Iterables.getFirst(entries, null); if (firstWidget == null) return; @SuppressWarnings("rawtypes") EntryStack first = firstWidget.getCurrentEntry(); EntryRenderer renderer = first.getRenderer(); - 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(); - for (T listEntry : entries) { - @SuppressWarnings("rawtypes") - EntryStack currentEntry = listEntry.getCurrentEntry(); - currentEntry.setZ(100); - listEntry.drawBackground(matrices, mouseX, mouseY, delta); - firstRenderer.renderBase(currentEntry, matrices, immediate, listEntry.getInnerBounds(), mouseX, mouseY, delta); - if (debugTime && !currentEntry.isEmpty()) size.increment(); - } - immediate.endBatch(); - for (T listEntry : entries) { - @SuppressWarnings("rawtypes") - EntryStack currentEntry = listEntry.getCurrentEntry(); - firstRenderer.renderOverlay(currentEntry, matrices, immediate, listEntry.getInnerBounds(), mouseX, mouseY, delta); - if (listEntry.containsMouse(mouseX, mouseY)) { - listEntry.queueTooltip(matrices, mouseX, mouseY, delta); - listEntry.drawHighlighted(matrices, mouseX, mouseY, delta); - } - } - immediate.endBatch(); - if (debugTime) time.add(System.nanoTime() - l); - firstRenderer.endBatch(first, matrices, delta); - } else { - for (T entry : entries) { - if (entry.getCurrentEntry().isEmpty()) - continue; - if (debugTime) { - size.increment(); - long l = System.nanoTime(); - entry.render(matrices, mouseX, mouseY, delta); - time.add(System.nanoTime() - l); - } else entry.render(matrices, mouseX, mouseY, delta); + BatchedEntryRenderer firstRenderer = (BatchedEntryRenderer) renderer; + matrices = firstRenderer.batchModifyMatrices(matrices); + firstRenderer.startBatch(first, extraData[0], matrices, delta); + long l = debugTime ? System.nanoTime() : 0; + MultiBufferSource.BufferSource immediate = Minecraft.getInstance().renderBuffers().bufferSource(); + int i = 0; + for (T listEntry : entries) { + @SuppressWarnings("rawtypes") + EntryStack currentEntry = listEntry.getCurrentEntry(); + currentEntry.setZ(100); + listEntry.drawBackground(matrices, mouseX, mouseY, delta); + firstRenderer.renderBase(currentEntry, extraData[i++], matrices, immediate, listEntry.getInnerBounds(), mouseX, mouseY, delta); + if (debugTime && !currentEntry.isEmpty()) size.increment(); + } + immediate.endBatch(); + i = 0; + for (T listEntry : entries) { + @SuppressWarnings("rawtypes") + EntryStack currentEntry = listEntry.getCurrentEntry(); + firstRenderer.renderOverlay(currentEntry, extraData[i++], matrices, immediate, listEntry.getInnerBounds(), mouseX, mouseY, delta); + if (listEntry.containsMouse(mouseX, mouseY)) { + listEntry.queueTooltip(matrices, mouseX, mouseY, delta); + listEntry.drawHighlighted(matrices, mouseX, mouseY, delta); } } + immediate.endBatch(); + if (debugTime) time.add(System.nanoTime() - l); + firstRenderer.endBatch(first, extraData[0], matrices, delta); + } + + private static void renderSlow(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable entries) { + for (T entry : entries) { + if (entry.getCurrentEntry().isEmpty()) + continue; + if (debugTime) { + size.increment(); + long l = System.nanoTime(); + entry.render(matrices, mouseX, mouseY, delta); + time.add(System.nanoTime() - l); + } else entry.render(matrices, mouseX, mouseY, delta); + } } } 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 d3c666b68..8742000eb 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 @@ -196,18 +196,21 @@ public class ItemEntryDefinition implements EntryDefinition, EntrySer @SuppressWarnings("deprecation") @Environment(EnvType.CLIENT) - public class ItemEntryRenderer extends AbstractEntryRenderer implements BatchedEntryRenderer { + public class ItemEntryRenderer extends AbstractEntryRenderer implements BatchedEntryRenderer { + public static final int ITEM_LIGHT = 0xf000f0; + @Override - public int getBatchIdentifier(EntryStack entry, Rectangle bounds) { - return 1738923 + (getModelFromStack(entry.getValue()).usesBlockLight() ? 1 : 0); + public BakedModel getExtraData(EntryStack entry) { + return Minecraft.getInstance().getItemRenderer().getModel(entry.getValue(), null, null); } - private BakedModel getModelFromStack(ItemStack stack) { - return Minecraft.getInstance().getItemRenderer().getModel(stack, null, null); + @Override + public int getBatchIdentifier(EntryStack entry, Rectangle bounds, BakedModel model) { + return 1738923 + (model.usesBlockLight() ? 1 : 0); } @Override - public void startBatch(EntryStack entry, PoseStack matrices, float delta) { + public void startBatch(EntryStack entry, BakedModel model, PoseStack matrices, float delta) { Minecraft.getInstance().getTextureManager().bind(TextureAtlas.LOCATION_BLOCKS); Minecraft.getInstance().getTextureManager().getTexture(TextureAtlas.LOCATION_BLOCKS).setFilter(false, false); RenderSystem.pushMatrix(); @@ -217,25 +220,25 @@ public class ItemEntryDefinition implements EntryDefinition, EntrySer RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - boolean sideLit = getModelFromStack(entry.getValue()).usesBlockLight(); + boolean sideLit = model.usesBlockLight(); if (!sideLit) Lighting.setupForFlatItems(); } @Override - public void renderBase(EntryStack entry, PoseStack matrices, MultiBufferSource.BufferSource immediate, Rectangle bounds, int mouseX, int mouseY, float delta) { + public void renderBase(EntryStack entry, BakedModel model, PoseStack matrices, MultiBufferSource.BufferSource immediate, Rectangle bounds, int mouseX, int mouseY, float delta) { if (!entry.isEmpty()) { ItemStack stack = entry.getValue(); matrices.pushPose(); matrices.translate(bounds.getCenterX(), bounds.getCenterY(), 100.0F + entry.getZ()); matrices.scale(bounds.getWidth(), (bounds.getWidth() + bounds.getHeight()) / -2f, bounds.getHeight()); - Minecraft.getInstance().getItemRenderer().render(stack, ItemTransforms.TransformType.GUI, false, matrices, immediate, 15728880, OverlayTexture.NO_OVERLAY, getModelFromStack(stack)); + Minecraft.getInstance().getItemRenderer().render(stack, ItemTransforms.TransformType.GUI, false, matrices, immediate, ITEM_LIGHT, OverlayTexture.NO_OVERLAY, model); matrices.popPose(); } } @Override - public void renderOverlay(EntryStack entry, PoseStack matrices, MultiBufferSource.BufferSource immediate, Rectangle bounds, int mouseX, int mouseY, float delta) { + public void renderOverlay(EntryStack entry, BakedModel model, PoseStack matrices, MultiBufferSource.BufferSource immediate, Rectangle bounds, int mouseX, int mouseY, float delta) { if (!entry.isEmpty()) { Minecraft.getInstance().getItemRenderer().blitOffset = entry.getZ(); Minecraft.getInstance().getItemRenderer().renderGuiItemDecorations(Minecraft.getInstance().font, entry.getValue(), bounds.x, bounds.y, null); @@ -244,11 +247,11 @@ public class ItemEntryDefinition implements EntryDefinition, EntrySer } @Override - public void endBatch(EntryStack entry, PoseStack matrices, float delta) { + public void endBatch(EntryStack entry, BakedModel model, PoseStack matrices, float delta) { RenderSystem.enableDepthTest(); RenderSystem.disableAlphaTest(); RenderSystem.disableRescaleNormal(); - boolean sideLit = getModelFromStack(entry.getValue()).usesBlockLight(); + boolean sideLit = model.usesBlockLight(); if (!sideLit) Lighting.setupFor3DItems(); RenderSystem.popMatrix(); -- cgit