diff --git a/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/MixinModelManager.java b/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/MixinModelManager.java index c8da77ca..3fa32b08 100644 --- a/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/MixinModelManager.java +++ b/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/MixinModelManager.java @@ -5,11 +5,15 @@ import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.resources.model.BlockStateModelLoader; import net.minecraft.client.resources.model.ClientItemInfoLoader; +import net.minecraft.client.resources.model.ModelDiscovery; import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.client.resources.model.ResolvedModel; import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.client.resources.model.cuboid.ItemModelGenerator; import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.Resource; import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.client.model.standalone.StandaloneModelLoader; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.dynresources.BlockStateModelMap; import org.embeddedt.modernfix.dynresources.DynamicModelSystem; @@ -17,10 +21,13 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.Redirect; +import java.util.Collection; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; +import java.util.function.Consumer; import java.util.function.Function; @Mixin(ModelManager.class) @@ -38,13 +45,38 @@ public class MixinModelManager { /** * @author embeddedt - * @reason Model resolution is not necessary, because we dynamically find models as they are referenced + * @reason Stop all models from being loaded at startup by the model resolution logic. */ - @Overwrite - private static ModelManager.ResolvedModels discoverModelDependencies( - Map inputModels, BlockStateModelLoader.LoadedModels loadedModels, ClientItemInfoLoader.LoadedClientInfos loadedClientInfos, net.neoforged.neoforge.client.model.standalone.StandaloneModelLoader.LoadedModels standaloneModels + @Redirect( + method = "discoverModelDependencies(Ljava/util/Map;Lnet/minecraft/client/resources/model/BlockStateModelLoader$LoadedModels;Lnet/minecraft/client/resources/model/ClientItemInfoLoader$LoadedClientInfos;Lnet/neoforged/neoforge/client/model/standalone/StandaloneModelLoader$LoadedModels;)Lnet/minecraft/client/resources/model/ModelManager$ResolvedModels;", + at = @At(value = "INVOKE", target = "Ljava/util/Collection;forEach(Ljava/util/function/Consumer;)V")) + private static void skipAddingRoot(Collection instance, Consumer consumer) { + } + + /** + * @author embeddedt, coredex + * @reason Divert to our dynamic resolver. It is cleaner to overwrite the whole method, but this seems to cause + * a conflict with Sodium. + */ + @Redirect( + method = "discoverModelDependencies(Ljava/util/Map;Lnet/minecraft/client/resources/model/BlockStateModelLoader$LoadedModels;Lnet/minecraft/client/resources/model/ClientItemInfoLoader$LoadedClientInfos;Lnet/neoforged/neoforge/client/model/standalone/StandaloneModelLoader$LoadedModels;)Lnet/minecraft/client/resources/model/ModelManager$ResolvedModels;", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/ModelDiscovery;resolve()Ljava/util/Map;") + ) + private static Map useDynamicResolverMap( + ModelDiscovery discovery, + Map allModels, + BlockStateModelLoader.LoadedModels blockStateModels, + ClientItemInfoLoader.LoadedClientInfos itemInfos, + StandaloneModelLoader.LoadedModels standaloneModels ) { - return new DynamicModelSystem.DynamicResolver(inputModels, loadedModels, loadedClientInfos, standaloneModels).resolvedModels(); + UnbakedModel generatedItemModel; + var generatedItemWrapper = ((ModelDiscoveryAccessor) discovery).mfix$getModelWrappers().get(ItemModelGenerator.GENERATED_ITEM_MODEL_ID); + if (generatedItemWrapper != null) { + generatedItemModel = generatedItemWrapper.wrapped(); + } else { + generatedItemModel = new ItemModelGenerator(); + } + return new DynamicModelSystem.DynamicResolver(allModels, blockStateModels, itemInfos, standaloneModels, generatedItemModel).resolvedModelsMap(); } /** diff --git a/src/main/java/org/embeddedt/modernfix/dynresources/DynamicModelSystem.java b/src/main/java/org/embeddedt/modernfix/dynresources/DynamicModelSystem.java index 2dc8ad64..32a22c8a 100644 --- a/src/main/java/org/embeddedt/modernfix/dynresources/DynamicModelSystem.java +++ b/src/main/java/org/embeddedt/modernfix/dynresources/DynamicModelSystem.java @@ -15,7 +15,6 @@ import net.minecraft.client.renderer.item.ClientItem; import net.minecraft.client.resources.model.ClientItemInfoLoader; import org.jetbrains.annotations.Nullable; import net.minecraft.client.resources.model.ModelDiscovery; -import net.minecraft.client.resources.model.ModelManager; import net.minecraft.client.resources.model.ResolvedModel; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.client.resources.model.cuboid.ItemModelGenerator; @@ -138,7 +137,8 @@ public class DynamicModelSystem { public record DynamicResolver(Map inputModels, BlockStateModelLoader.LoadedModels loadedModels, ClientItemInfoLoader.LoadedClientInfos loadedClientInfos, - StandaloneModelLoader.LoadedModels standaloneModels) { + StandaloneModelLoader.LoadedModels standaloneModels, + UnbakedModel generatedItemModel) { private ResolvedModel resolveModel(Identifier id) { var discovery = new ModelDiscovery(inputModels, MissingCuboidModel.missingModel()); @@ -156,15 +156,14 @@ public class DynamicModelSystem { return resolved.getOrDefault(id, discovery.missingModel()); } - public ModelManager.ResolvedModels resolvedModels() { - var resolvedMissingModel = new ModelDiscovery(inputModels, MissingCuboidModel.missingModel()).missingModel(); + public Map resolvedModelsMap() { LoadingCache resolvedModelCache = CacheBuilder.newBuilder().softValues().maximumSize(1000).build(new CacheLoader<>() { @Override public ResolvedModel load(Identifier key) { return resolveModel(key); } }); - return new ModelManager.ResolvedModels(resolvedMissingModel, Maps.asMap(inputModels.keySet(), resolvedModelCache::getUnchecked)); + return Maps.asMap(inputModels.keySet(), resolvedModelCache::getUnchecked); } }