From 9ed71dcdb483b5432b84eac256b4edc5379f95c3 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 24 Dec 2024 15:14:41 -0500 Subject: [PATCH] Provide emulated registries permanently --- .../dynamic_resources/ModelManagerMixin.java | 41 ++++----------- .../DynamicModelProvider.java | 50 ++++++++++++------- 2 files changed, 44 insertions(+), 47 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelManagerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelManagerMixin.java index 4e8dbf9f..61c0c949 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelManagerMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelManagerMixin.java @@ -25,8 +25,10 @@ import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.lang.ref.WeakReference; import java.util.Map; @@ -36,7 +38,10 @@ import java.util.concurrent.Executor; @Mixin(ModelManager.class) @ClientOnlyMixin public class ModelManagerMixin implements DynamicModelProvider.ModelManagerExtension { - @Shadow private BakedModel missingModel; + @Shadow private Map bakedBlockStateModels; + @Shadow private Map bakedItemStackModels; + @Shadow private Map itemProperties; + @Unique private DynamicModelProvider mfix$modelProvider; @@ -79,35 +84,11 @@ public class ModelManagerMixin implements DynamicModelProvider.ModelManagerExten return ArrayUtils.add(cfs, makeModelProviderFuture); } - /** - * @author embeddedt - * @reason use dynamic model system - */ - @Overwrite - public BakedModel getModel(ModelResourceLocation modelLocation) { - if(this.mfix$modelProvider != null) { - return this.mfix$modelProvider.getModel(modelLocation); - } else { - return this.missingModel; - } - } - - /** - * @author embeddedt - * @reason use dynamic model system - */ - @Overwrite - public ItemModel getItemModel(ResourceLocation resourceLocation) { - return this.mfix$modelProvider.getItemModel(resourceLocation); - } - - /** - * @author embeddedt - * @reason use dynamic model system - */ - @Overwrite - public ClientItem.Properties getItemProperties(ResourceLocation resourceLocation) { - return this.mfix$modelProvider.getClientItemProperties(resourceLocation); + @Inject(method = "apply", at = @At("RETURN")) + private void setModelRegistries(CallbackInfo ci) { + this.bakedBlockStateModels = this.mfix$modelProvider.getTopLevelEmulatedRegistry(); + this.bakedItemStackModels = this.mfix$modelProvider.getItemModelEmulatedRegistry(); + this.itemProperties = this.mfix$modelProvider.getItemPropertiesEmulatedRegistry(); } @Override diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java index 3de867f5..9b88ff86 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java @@ -1,8 +1,10 @@ package org.embeddedt.modernfix.dynamicresources; +import com.google.common.base.Suppliers; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; +import com.google.common.collect.Collections2; import com.google.common.collect.Iterators; import com.google.common.collect.Maps; import com.google.gson.JsonObject; @@ -61,6 +63,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import java.util.function.BiFunction; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Collectors; /** @@ -149,28 +152,32 @@ public class DynamicModelProvider { return this.missingItemModel; } - public Map getTopLevelEmulatedRegistry() { - Set topLevelModelLocations = new HashSet<>(); + private static final Supplier> TOP_LEVEL_LOCATIONS_SUPPLIER = Suppliers.memoizeWithExpiration(() -> { + Set set = new HashSet<>(); // Skip going through ModelLocationCache because most of the accesses will be misses BuiltInRegistries.BLOCK.entrySet().forEach(entry -> { var location = entry.getKey().location(); for(BlockState state : entry.getValue().getStateDefinition().getPossibleStates()) { - topLevelModelLocations.add(BlockModelShaper.stateToModelLocation(location, state)); + set.add(BlockModelShaper.stateToModelLocation(location, state)); } }); - return new EmulatedRegistry<>(ModelResourceLocation.class, this.loadedBakedModels, topLevelModelLocations, this.mrlModelOverrides); + return Collections.unmodifiableSet(set); + }, 2, TimeUnit.MINUTES); + + public Map getTopLevelEmulatedRegistry() { + return new EmulatedRegistry<>(ModelResourceLocation.class, this.loadedBakedModels, TOP_LEVEL_LOCATIONS_SUPPLIER, this.mrlModelOverrides); } public Map getStandaloneEmulatedRegistry() { - return new EmulatedRegistry<>(ResourceLocation.class, this.loadedStandaloneModels, Set.of(), this.standaloneModelOverrides); + return new EmulatedRegistry<>(ResourceLocation.class, this.loadedStandaloneModels, Set::of, this.standaloneModelOverrides); } public Map getItemModelEmulatedRegistry() { - return new EmulatedRegistry<>(ResourceLocation.class, this.loadedItemModels, BuiltInRegistries.ITEM.keySet(), this.itemStackModelOverrides); + return new EmulatedRegistry<>(ResourceLocation.class, this.loadedItemModels, BuiltInRegistries.ITEM::keySet, this.itemStackModelOverrides); } public Map getItemPropertiesEmulatedRegistry() { - return Maps.transformValues(new EmulatedRegistry<>(ResourceLocation.class, this.loadedClientItemProperties, BuiltInRegistries.ITEM.keySet(), Map.of()), ClientItem::properties); + return Maps.transformValues(new EmulatedRegistry<>(ResourceLocation.class, this.loadedClientItemProperties, BuiltInRegistries.ITEM::keySet, Map.of()), ClientItem::properties); } private LoadingCache> makeLoadingCache(Function> loadingFunction) { @@ -189,14 +196,14 @@ public class DynamicModelProvider { private static class EmulatedRegistry implements Map { private final LoadingCache> realCache; - private final Set keys; + private final Supplier> keys; private final Map overrides; private final Class keyClass; - public EmulatedRegistry(Class keyClass, LoadingCache> realCache, Set keys, Map overrides) { + public EmulatedRegistry(Class keyClass, LoadingCache> realCache, Supplier> keys, Map overrides) { this.keyClass = keyClass; this.realCache = realCache; - this.keys = Collections.unmodifiableSet(keys); + this.keys = keys; this.overrides = overrides; } @@ -209,6 +216,15 @@ public class DynamicModelProvider { } } + @Override + public V getOrDefault(Object key, V defaultValue) { + if (this.keyClass.isAssignableFrom(key.getClass())) { + return this.realCache.getUnchecked((K)key).orElse(defaultValue); + } else { + return defaultValue; + } + } + @Override public V put(K key, V value) { V oldValue = this.realCache.getUnchecked(key).orElse(null); @@ -237,17 +253,17 @@ public class DynamicModelProvider { @Override public @NotNull Set keySet() { - return keys; + return keys.get(); } @Override public @NotNull Collection values() { - return List.of(); + return Collections2.transform(this.realCache.asMap().values(), v -> v.orElse(null)); } @Override public int size() { - return keys.size(); + return keys.get().size(); } @Override @@ -257,7 +273,7 @@ public class DynamicModelProvider { @Override public boolean containsKey(Object key) { - return keys.contains(key); + return keys.get().contains(key); } @Override @@ -270,7 +286,7 @@ public class DynamicModelProvider { return new AbstractSet<>() { @Override public Iterator> iterator() { - return Iterators.transform(keys.iterator(), key -> new Entry<>() { + return Iterators.transform(keys.get().iterator(), key -> new Entry<>() { @Override public K getKey() { return key; @@ -290,14 +306,14 @@ public class DynamicModelProvider { @Override public int size() { - return keys.size(); + return keys.get().size(); } }; } @Override public void replaceAll(BiFunction function) { - for(K location : keys) { + for(K location : keys.get()) { /* * Fetching every model is insanely slow. So we call the function with a null object first, since it * probably isn't expecting that. If we get an exception thrown, or it returns nonnull, then we know