Skip to content

Commit 5028572

Browse files
Adjust the model discovery mixin to not conflict with Sodium
Closes #644 Fixes #642 Fixes #640 Co-authored-by: coredex-source <samdhi2323@gmail.com>
1 parent 6e4074b commit 5028572

2 files changed

Lines changed: 41 additions & 10 deletions

File tree

src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/MixinModelManager.java

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,29 @@
55
import net.minecraft.client.renderer.block.dispatch.BlockStateModel;
66
import net.minecraft.client.resources.model.BlockStateModelLoader;
77
import net.minecraft.client.resources.model.ClientItemInfoLoader;
8+
import net.minecraft.client.resources.model.ModelDiscovery;
89
import net.minecraft.client.resources.model.ModelManager;
10+
import net.minecraft.client.resources.model.ResolvedModel;
911
import net.minecraft.client.resources.model.UnbakedModel;
12+
import net.minecraft.client.resources.model.cuboid.ItemModelGenerator;
1013
import net.minecraft.resources.Identifier;
1114
import net.minecraft.server.packs.resources.Resource;
1215
import net.minecraft.world.level.block.state.BlockState;
16+
import net.neoforged.neoforge.client.model.standalone.StandaloneModelLoader;
1317
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
1418
import org.embeddedt.modernfix.dynresources.BlockStateModelMap;
1519
import org.embeddedt.modernfix.dynresources.DynamicModelSystem;
1620
import org.spongepowered.asm.mixin.Mixin;
1721
import org.spongepowered.asm.mixin.Overwrite;
1822
import org.spongepowered.asm.mixin.injection.At;
1923
import org.spongepowered.asm.mixin.injection.ModifyArg;
24+
import org.spongepowered.asm.mixin.injection.Redirect;
2025

26+
import java.util.Collection;
2127
import java.util.Map;
2228
import java.util.concurrent.CompletableFuture;
2329
import java.util.concurrent.CompletionStage;
30+
import java.util.function.Consumer;
2431
import java.util.function.Function;
2532

2633
@Mixin(ModelManager.class)
@@ -38,13 +45,38 @@ public class MixinModelManager {
3845

3946
/**
4047
* @author embeddedt
41-
* @reason Model resolution is not necessary, because we dynamically find models as they are referenced
48+
* @reason Stop all models from being loaded at startup by the model resolution logic.
4249
*/
43-
@Overwrite
44-
private static ModelManager.ResolvedModels discoverModelDependencies(
45-
Map<Identifier, UnbakedModel> inputModels, BlockStateModelLoader.LoadedModels loadedModels, ClientItemInfoLoader.LoadedClientInfos loadedClientInfos, net.neoforged.neoforge.client.model.standalone.StandaloneModelLoader.LoadedModels standaloneModels
50+
@Redirect(
51+
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;",
52+
at = @At(value = "INVOKE", target = "Ljava/util/Collection;forEach(Ljava/util/function/Consumer;)V"))
53+
private static <T> void skipAddingRoot(Collection<T> instance, Consumer<T> consumer) {
54+
}
55+
56+
/**
57+
* @author embeddedt, coredex
58+
* @reason Divert to our dynamic resolver. It is cleaner to overwrite the whole method, but this seems to cause
59+
* a conflict with Sodium.
60+
*/
61+
@Redirect(
62+
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;",
63+
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/ModelDiscovery;resolve()Ljava/util/Map;")
64+
)
65+
private static Map<Identifier, ResolvedModel> useDynamicResolverMap(
66+
ModelDiscovery discovery,
67+
Map<Identifier, UnbakedModel> allModels,
68+
BlockStateModelLoader.LoadedModels blockStateModels,
69+
ClientItemInfoLoader.LoadedClientInfos itemInfos,
70+
StandaloneModelLoader.LoadedModels standaloneModels
4671
) {
47-
return new DynamicModelSystem.DynamicResolver(inputModels, loadedModels, loadedClientInfos, standaloneModels).resolvedModels();
72+
UnbakedModel generatedItemModel;
73+
var generatedItemWrapper = ((ModelDiscoveryAccessor) discovery).mfix$getModelWrappers().get(ItemModelGenerator.GENERATED_ITEM_MODEL_ID);
74+
if (generatedItemWrapper != null) {
75+
generatedItemModel = generatedItemWrapper.wrapped();
76+
} else {
77+
generatedItemModel = new ItemModelGenerator();
78+
}
79+
return new DynamicModelSystem.DynamicResolver(allModels, blockStateModels, itemInfos, standaloneModels, generatedItemModel).resolvedModelsMap();
4880
}
4981

5082
/**

src/main/java/org/embeddedt/modernfix/dynresources/DynamicModelSystem.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import net.minecraft.client.resources.model.ClientItemInfoLoader;
1616
import org.jetbrains.annotations.Nullable;
1717
import net.minecraft.client.resources.model.ModelDiscovery;
18-
import net.minecraft.client.resources.model.ModelManager;
1918
import net.minecraft.client.resources.model.ResolvedModel;
2019
import net.minecraft.client.resources.model.UnbakedModel;
2120
import net.minecraft.client.resources.model.cuboid.ItemModelGenerator;
@@ -138,7 +137,8 @@ public static ClientItemInfoLoader.LoadedClientInfos createDynamicClientInfos(Ma
138137
public record DynamicResolver(Map<Identifier, UnbakedModel> inputModels,
139138
BlockStateModelLoader.LoadedModels loadedModels,
140139
ClientItemInfoLoader.LoadedClientInfos loadedClientInfos,
141-
StandaloneModelLoader.LoadedModels standaloneModels) {
140+
StandaloneModelLoader.LoadedModels standaloneModels,
141+
UnbakedModel generatedItemModel) {
142142

143143
private ResolvedModel resolveModel(Identifier id) {
144144
var discovery = new ModelDiscovery(inputModels, MissingCuboidModel.missingModel());
@@ -156,15 +156,14 @@ private ResolvedModel resolveModel(Identifier id) {
156156
return resolved.getOrDefault(id, discovery.missingModel());
157157
}
158158

159-
public ModelManager.ResolvedModels resolvedModels() {
160-
var resolvedMissingModel = new ModelDiscovery(inputModels, MissingCuboidModel.missingModel()).missingModel();
159+
public Map<Identifier, ResolvedModel> resolvedModelsMap() {
161160
LoadingCache<Identifier, ResolvedModel> resolvedModelCache = CacheBuilder.newBuilder().softValues().maximumSize(1000).build(new CacheLoader<>() {
162161
@Override
163162
public ResolvedModel load(Identifier key) {
164163
return resolveModel(key);
165164
}
166165
});
167-
return new ModelManager.ResolvedModels(resolvedMissingModel, Maps.asMap(inputModels.keySet(), resolvedModelCache::getUnchecked));
166+
return Maps.asMap(inputModels.keySet(), resolvedModelCache::getUnchecked);
168167
}
169168
}
170169

0 commit comments

Comments
 (0)