From 5fa94bf5e4cb64eed37b03f0bc7db2e5b8bdc646 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 18 Dec 2023 21:39:18 -0500 Subject: [PATCH 1/5] Add Elevator Mod to dynamic resources iteration list --- .../modernfix/forge/dynresources/ModelBakeEventHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java index 48d568a4..c05dd603 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java @@ -28,7 +28,7 @@ import java.util.*; */ public class ModelBakeEventHelper { // TODO: make into config option - private static final Set INCOMPATIBLE_MODS = ImmutableSet.of("industrialforegoing", "vampirism"); + private static final Set INCOMPATIBLE_MODS = ImmutableSet.of("industrialforegoing", "vampirism", "elevatorid"); private final Map modelRegistry; private final Set topLevelModelLocations; private final MutableGraph dependencyGraph; From aa53a7610b84471458cc6ea94e9b62ae7a85e661 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 18 Dec 2023 22:02:21 -0500 Subject: [PATCH 2/5] Only wrap top-level CTM models if dynamic resources is on --- .../perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java index 8d79ddba..1e1e16ca 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java @@ -42,7 +42,7 @@ public abstract class TextureMetadataHandlerMixin implements ModernFixClientInte @Override public BakedModel onBakedModelLoad(ResourceLocation rl, UnbakedModel rootModel, BakedModel baked, ModelState state, ModelBakery bakery) { - if (!(baked instanceof AbstractCTMBakedModel) && !baked.isCustomRenderer()) { + if (rl instanceof ModelResourceLocation && !(baked instanceof AbstractCTMBakedModel) && !baked.isCustomRenderer()) { Deque dependencies = new ArrayDeque<>(); Set seenModels = new HashSet<>(); dependencies.push(rl); From 9c00f7297d5542f73c3712d1f766c275286905da Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 18 Dec 2023 22:03:18 -0500 Subject: [PATCH 3/5] Reset block predicate when model is loaded Should help invalidate Embeddium's cache --- .../dynamic_resources/ctm/CTMPackReloadListenerMixin.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java index 095c122b..cc55b264 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java @@ -63,11 +63,15 @@ public abstract class CTMPackReloadListenerMixin implements ModernFixClientInteg if(original == null) original = DEFAULT_PREDICATE; blockRenderChecks.put(block.delegate, original); - ItemBlockRenderTypes.setRenderLayer(block, type -> this.useOverrideIfPresent(block.delegate, type)); + updateBlockPredicate(block); } } } + private void updateBlockPredicate(Block block) { + ItemBlockRenderTypes.setRenderLayer(block, type -> this.useOverrideIfPresent(block.delegate, type)); + } + private boolean useOverrideIfPresent(IRegistryDelegate delegate, RenderType type) { Predicate override = renderCheckOverrides.get(delegate); if(override == null) @@ -97,6 +101,7 @@ public abstract class CTMPackReloadListenerMixin implements ModernFixClientInteg Predicate newPredicate = this.getLayerCheck(state, originalModel); if(newPredicate != null) { renderCheckOverrides.put(block.delegate, newPredicate); + updateBlockPredicate(block); return originalModel; } } From 7e2f3f3fb9689b94b6cac9d0ed02b30b6adf36eb Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 21 Dec 2023 12:30:17 -0500 Subject: [PATCH 4/5] Rewrite CTM predicate handling again, fix more bugs --- .../dynresources/ModernFixCTMPredicate.java | 16 +++++ .../ctm/CTMPackReloadListenerMixin.java | 68 ++++++++++++------- 2 files changed, 61 insertions(+), 23 deletions(-) create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModernFixCTMPredicate.java diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModernFixCTMPredicate.java b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModernFixCTMPredicate.java new file mode 100644 index 00000000..da75b047 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModernFixCTMPredicate.java @@ -0,0 +1,16 @@ +package org.embeddedt.modernfix.forge.dynresources; + +import net.minecraft.client.renderer.RenderType; + +import java.util.function.Predicate; + +public class ModernFixCTMPredicate implements Predicate { + public Predicate ctmOverride; + public Predicate defaultPredicate = type -> type == RenderType.solid(); + + @Override + public boolean test(RenderType renderType) { + Predicate override = ctmOverride; + return override != null ? override.test(renderType) : defaultPredicate.test(renderType); + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java index cc55b264..d39b0994 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java @@ -1,6 +1,7 @@ package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources.ctm; import com.google.common.collect.ImmutableList; +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.resources.model.*; @@ -16,6 +17,7 @@ import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.annotation.RequiresMod; import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration; import org.embeddedt.modernfix.api.helpers.ModelHelpers; +import org.embeddedt.modernfix.forge.dynresources.ModernFixCTMPredicate; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; @@ -27,7 +29,6 @@ import team.chisel.ctm.client.model.AbstractCTMBakedModel; import team.chisel.ctm.client.util.CTMPackReloadListener; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; @Mixin(CTMPackReloadListener.class) @@ -37,7 +38,7 @@ public abstract class CTMPackReloadListenerMixin implements ModernFixClientInteg /* caches the original render checks */ @Shadow(remap = false) @Final private static Map, Predicate> blockRenderChecks; - private static Map, Predicate> renderCheckOverrides = new ConcurrentHashMap<>(); + private static volatile Map, ModernFixCTMPredicate> mfixBouncerPredicates = null; private static Predicate DEFAULT_PREDICATE = type -> type == RenderType.solid(); @@ -50,33 +51,55 @@ public abstract class CTMPackReloadListenerMixin implements ModernFixClientInteg ModernFixClient.CLIENT_INTEGRATIONS.add(this); } + private static void initMap() { + if(mfixBouncerPredicates == null) { + synchronized (CTMPackReloadListener.class) { + if(mfixBouncerPredicates == null) { + Map, ModernFixCTMPredicate> map = new Reference2ReferenceOpenHashMap<>(); + for(Block registeredBlock : ForgeRegistries.BLOCKS.getValues()) { + map.put(registeredBlock.delegate, new ModernFixCTMPredicate()); + } + mfixBouncerPredicates = map; + } + } + } + } + /** * @author embeddedt * @reason handle layer changes dynamically */ @Overwrite(remap = false) private void refreshLayerHacks() { - renderCheckOverrides.clear(); - if(blockRenderChecks.isEmpty()) { - for(Block block : ForgeRegistries.BLOCKS.getValues()) { - Predicate original = this.getExistingRenderCheck(block); - if(original == null) - original = DEFAULT_PREDICATE; + // Make sure predicate map exists + initMap(); + mfixBouncerPredicates.values().forEach(bouncer -> bouncer.ctmOverride = null); + } + + private static ModernFixCTMPredicate getPredicateForBlock(Block block) { + initMap(); + ModernFixCTMPredicate predicate = mfixBouncerPredicates.get(block.delegate); + if(predicate == null) { + throw new NullPointerException("ModernFix CTM predicate missing for block: " + block.getRegistryName()); + } + return predicate; + } + + private void updateBlockPredicate(Block block, Predicate override) { + Predicate original = this.getExistingRenderCheck(block); + if(original == null) { + original = DEFAULT_PREDICATE; + } + ModernFixCTMPredicate bouncer = getPredicateForBlock(block); + if(original != bouncer) { + // Give the bouncer the original predicate for correct behavior + bouncer.defaultPredicate = original; + synchronized (ItemBlockRenderTypes.class) { blockRenderChecks.put(block.delegate, original); - updateBlockPredicate(block); } } - } - - private void updateBlockPredicate(Block block) { - ItemBlockRenderTypes.setRenderLayer(block, type -> this.useOverrideIfPresent(block.delegate, type)); - } - - private boolean useOverrideIfPresent(IRegistryDelegate delegate, RenderType type) { - Predicate override = renderCheckOverrides.get(delegate); - if(override == null) - override = blockRenderChecks.get(delegate); - return override.test(type); + bouncer.ctmOverride = override; + ItemBlockRenderTypes.setRenderLayer(block, bouncer); } @Override @@ -87,7 +110,7 @@ public abstract class CTMPackReloadListenerMixin implements ModernFixClientInteg return originalModel; /* we construct a new ResourceLocation because an MRL is coming in */ Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(location.getNamespace(), location.getPath())); - if(block == null || block == Blocks.AIR || renderCheckOverrides.containsKey(block.delegate)) + if(block == null || block == Blocks.AIR || getPredicateForBlock(block).ctmOverride != null) return originalModel; /* find all states that match this MRL */ ImmutableList allStates; @@ -100,8 +123,7 @@ public abstract class CTMPackReloadListenerMixin implements ModernFixClientInteg for(BlockState state : allStates) { Predicate newPredicate = this.getLayerCheck(state, originalModel); if(newPredicate != null) { - renderCheckOverrides.put(block.delegate, newPredicate); - updateBlockPredicate(block); + updateBlockPredicate(block, newPredicate); return originalModel; } } From 1cfe0216ac8991ba7b44633579372609e8ffb43c Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 21 Dec 2023 13:31:02 -0500 Subject: [PATCH 5/5] Remove CTM layer hacks entirely on 1.19+, code is unused --- .../dynresources/ModernFixCTMPredicate.java | 16 --- .../ctm/CTMPackReloadListenerMixin.java | 109 ------------------ 2 files changed, 125 deletions(-) delete mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModernFixCTMPredicate.java delete mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModernFixCTMPredicate.java b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModernFixCTMPredicate.java deleted file mode 100644 index da75b047..00000000 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModernFixCTMPredicate.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.embeddedt.modernfix.forge.dynresources; - -import net.minecraft.client.renderer.RenderType; - -import java.util.function.Predicate; - -public class ModernFixCTMPredicate implements Predicate { - public Predicate ctmOverride; - public Predicate defaultPredicate = type -> type == RenderType.solid(); - - @Override - public boolean test(RenderType renderType) { - Predicate override = ctmOverride; - return override != null ? override.test(renderType) : defaultPredicate.test(renderType); - } -} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java deleted file mode 100644 index 8c747333..00000000 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources.ctm; - -import com.google.common.collect.ImmutableList; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.resources.model.*; -import net.minecraft.core.Holder; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.ChunkRenderTypeSet; -import net.minecraftforge.registries.ForgeRegistries; -import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.ModernFixClient; -import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -import org.embeddedt.modernfix.annotation.RequiresMod; -import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration; -import org.embeddedt.modernfix.api.helpers.ModelHelpers; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import team.chisel.ctm.client.model.AbstractCTMBakedModel; -import team.chisel.ctm.client.util.CTMPackReloadListener; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Predicate; - -@Mixin(CTMPackReloadListener.class) -@RequiresMod("ctm_but_dont_actually_enable") -@ClientOnlyMixin -public abstract class CTMPackReloadListenerMixin implements ModernFixClientIntegration { - /* caches the original render checks */ - @Shadow(remap = false) @Final private static Map, Predicate> blockRenderChecks; - - private static Map, Predicate> renderCheckOverrides = new ConcurrentHashMap<>(); - - private static ChunkRenderTypeSet DEFAULT_TYPE_SET = ChunkRenderTypeSet.of(RenderType.solid()); - - @Shadow(remap = false) protected abstract Predicate getLayerCheck(BlockState state, BakedModel model); - - @Shadow(remap = false) protected abstract ChunkRenderTypeSet getExistingRenderCheck(Block block); - - @Inject(method = "", at = @At("RETURN")) - private void onInit(CallbackInfo ci) { - ModernFixClient.CLIENT_INTEGRATIONS.add(this); - } - - /** - * @author embeddedt - * @reason handle layer changes dynamically - */ - @Overwrite(remap = false) - @SuppressWarnings("removal") - private void refreshLayerHacks() { - renderCheckOverrides.clear(); - if(blockRenderChecks.isEmpty()) { - for(Block block : ForgeRegistries.BLOCKS.getValues()) { - Holder.Reference holder = ForgeRegistries.BLOCKS.getDelegateOrThrow(block); - ChunkRenderTypeSet original = this.getExistingRenderCheck(block); - if(original == null) - original = DEFAULT_TYPE_SET; - blockRenderChecks.put(holder, original::contains); - ItemBlockRenderTypes.setRenderLayer(block, type -> this.useOverrideIfPresent(holder, type)); - } - } - } - - private boolean useOverrideIfPresent(Holder.Reference delegate, RenderType type) { - Predicate override = renderCheckOverrides.get(delegate); - if(override == null) - override = blockRenderChecks.get(delegate); - return override.test(type); - } - - @Override - public BakedModel onBakedModelLoad(ResourceLocation location, UnbakedModel baseModel, BakedModel originalModel, ModelState modelState, ModelBakery bakery) { - if(!(location instanceof ModelResourceLocation)) - return originalModel; - if(!(originalModel instanceof AbstractCTMBakedModel || originalModel instanceof WeightedBakedModel || originalModel instanceof MultiPartBakedModel)) - return originalModel; - /* we construct a new ResourceLocation because an MRL is coming in */ - Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(location.getNamespace(), location.getPath())); - Holder.Reference delegate = block != null ? ForgeRegistries.BLOCKS.getDelegateOrThrow(block) : null; - if(block == null || block == Blocks.AIR || renderCheckOverrides.containsKey(delegate)) - return originalModel; - /* find all states that match this MRL */ - ImmutableList allStates; - try { - allStates = ModelHelpers.getBlockStateForLocation(block.getStateDefinition(), (ModelResourceLocation)location); - } catch(RuntimeException e) { - ModernFix.LOGGER.error("Couldn't get state for MRL " + location, e); - return originalModel; - } - for(BlockState state : allStates) { - Predicate newPredicate = this.getLayerCheck(state, originalModel); - if(newPredicate != null) { - renderCheckOverrides.put(delegate, newPredicate); - return originalModel; - } - } - return originalModel; - } -}