diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockModelShaperMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockModelShaperMixin.java index 6e4f35ba..129157b6 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockModelShaperMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockModelShaperMixin.java @@ -6,10 +6,13 @@ import net.minecraft.client.resources.model.ModelManager; import net.minecraft.world.level.block.state.BlockState; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.dynamicresources.ModelLocationCache; -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.embeddedt.modernfix.util.DynamicMap; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Map; @Mixin(BlockModelShaper.class) @@ -17,6 +20,15 @@ import org.spongepowered.asm.mixin.Shadow; public class BlockModelShaperMixin { @Shadow @Final private ModelManager modelManager; + @Shadow @Final @Mutable + private Map modelByStateCache; + + @Inject(method = "", at = @At("RETURN")) + private void replaceModelMap(CallbackInfo ci) { + // replace the backing map for mods which will access it + this.modelByStateCache = new DynamicMap<>(state -> modelManager.getModel(ModelLocationCache.get(state))); + } + /** * @author embeddedt * @reason no need to rebuild model cache, and location cache is done elsewhere diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemModelShaperMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemModelShaperMixin.java index 7472760d..66a183f0 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemModelShaperMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemModelShaperMixin.java @@ -1,11 +1,13 @@ package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.client.renderer.ItemModelShaper; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelManager; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.world.item.Item; import org.embeddedt.modernfix.dynamicresources.ModelLocationCache; +import org.embeddedt.modernfix.util.DynamicInt2ObjectMap; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -19,6 +21,8 @@ public abstract class ItemModelShaperMixin { @Shadow public abstract ModelManager getModelManager(); + @Shadow @Final @Mutable private Int2ObjectMap shapesCache; + private Map overrideLocationsVanilla; public ItemModelShaperMixin() { @@ -30,6 +34,7 @@ public abstract class ItemModelShaperMixin { @Inject(method = "", at = @At("RETURN")) private void replaceLocationMap(CallbackInfo ci) { overrideLocationsVanilla = new HashMap<>(); + this.shapesCache = new DynamicInt2ObjectMap<>(index -> getModelManager().getModel(ModelLocationCache.get(Item.byId(index)))); } @Unique diff --git a/common/src/main/java/org/embeddedt/modernfix/util/DynamicInt2ObjectMap.java b/common/src/main/java/org/embeddedt/modernfix/util/DynamicInt2ObjectMap.java new file mode 100644 index 00000000..5c44208e --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/util/DynamicInt2ObjectMap.java @@ -0,0 +1,61 @@ +package org.embeddedt.modernfix.util; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.IntSet; +import it.unimi.dsi.fastutil.objects.ObjectCollection; +import it.unimi.dsi.fastutil.objects.ObjectSet; + +import java.util.Map; +import java.util.function.Function; + +public class DynamicInt2ObjectMap extends DynamicMap implements Int2ObjectMap { + public DynamicInt2ObjectMap(Function function) { + super(function); + } + + @Override + public IntSet keySet() { + throw new UnsupportedOperationException(); + } + + @Override + public ObjectCollection values() { + throw new UnsupportedOperationException(); + } + + @Override + public ObjectSet> entrySet() { + throw new UnsupportedOperationException(); + } + + @Override + public void defaultReturnValue(V rv) { + throw new UnsupportedOperationException(); + } + + @Override + public V defaultReturnValue() { + throw new UnsupportedOperationException(); + } + + @Override + public ObjectSet> int2ObjectEntrySet() { + throw new UnsupportedOperationException(); + } + + @Override + public V getOrDefault(int key, V defaultValue) { + V value = get(key); + return value == null ? defaultValue : value; + } + + @Override + public V get(int key) { + return function.apply(key); + } + + @Override + public boolean containsKey(int key) { + return true; + } +} diff --git a/common/src/main/java/org/embeddedt/modernfix/util/DynamicMap.java b/common/src/main/java/org/embeddedt/modernfix/util/DynamicMap.java new file mode 100644 index 00000000..e8803770 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/util/DynamicMap.java @@ -0,0 +1,81 @@ +package org.embeddedt.modernfix.util; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; + +public class DynamicMap implements Map { + protected final Function function; + + public DynamicMap(Function function) { + this.function = function; + } + + @Override + public int size() { + return 0; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public boolean containsKey(Object o) { + return true; + } + + @Override + public boolean containsValue(Object o) { + return true; + } + + @Override + public V get(Object o) { + return function.apply((K)o); + } + + @Nullable + @Override + public V put(K k, V v) { + throw new UnsupportedOperationException(); + } + + @Override + public V remove(Object o) { + throw new UnsupportedOperationException(); + } + + @Override + public void putAll(@NotNull Map map) { + throw new UnsupportedOperationException(); + } + + @Override + public void clear() { + throw new UnsupportedOperationException(); + } + + @NotNull + @Override + public Set keySet() { + throw new UnsupportedOperationException(); + } + + @NotNull + @Override + public Collection values() { + throw new UnsupportedOperationException(); + } + + @NotNull + @Override + public Set> entrySet() { + throw new UnsupportedOperationException(); + } +}