Skip to content

Commit 19d2d8c

Browse files
committed
Get dynamic model loading working with ModifyBakingResult
1 parent e82f316 commit 19d2d8c

File tree

5 files changed

+308
-334
lines changed

5 files changed

+308
-334
lines changed

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

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,41 @@
11
package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources;
22

3+
import com.google.common.collect.Maps;
4+
import com.llamalad7.mixinextras.sugar.Local;
35
import net.minecraft.client.Minecraft;
46
import net.minecraft.client.model.geom.EntityModelSet;
57
import net.minecraft.client.renderer.block.model.BlockModel;
68
import net.minecraft.client.renderer.item.ClientItem;
79
import net.minecraft.client.renderer.item.ItemModel;
10+
import net.minecraft.client.resources.model.AtlasSet;
811
import net.minecraft.client.resources.model.BakedModel;
912
import net.minecraft.client.resources.model.BlockStateModelLoader;
1013
import net.minecraft.client.resources.model.ModelManager;
1114
import net.minecraft.client.resources.model.ModelResourceLocation;
1215
import net.minecraft.client.resources.model.UnbakedModel;
1316
import net.minecraft.resources.ResourceLocation;
1417
import net.minecraft.server.packs.resources.ResourceManager;
15-
import net.minecraft.util.profiling.ProfilerFiller;
1618
import net.minecraft.world.level.block.state.BlockState;
19+
import org.apache.commons.lang3.ArrayUtils;
1720
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
1821
import org.embeddedt.modernfix.dynamicresources.DynamicModelProvider;
1922
import org.spongepowered.asm.mixin.Mixin;
2023
import org.spongepowered.asm.mixin.Overwrite;
2124
import org.spongepowered.asm.mixin.Shadow;
2225
import org.spongepowered.asm.mixin.Unique;
2326
import org.spongepowered.asm.mixin.injection.At;
24-
import org.spongepowered.asm.mixin.injection.Inject;
27+
import org.spongepowered.asm.mixin.injection.ModifyArg;
2528
import org.spongepowered.asm.mixin.injection.Redirect;
26-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
2729

30+
import java.lang.ref.WeakReference;
2831
import java.util.Map;
2932
import java.util.concurrent.CompletableFuture;
3033
import java.util.concurrent.Executor;
3134

3235
@Mixin(ModelManager.class)
3336
@ClientOnlyMixin
34-
public class ModelManagerMixin {
37+
public class ModelManagerMixin implements DynamicModelProvider.ModelManagerExtension {
3538
@Shadow private BakedModel missingModel;
36-
@Shadow private ItemModel missingItemModel;
37-
@Shadow private EntityModelSet entityModelSet;
3839
@Unique
3940
private DynamicModelProvider mfix$modelProvider;
4041

@@ -57,16 +58,19 @@ private static Map<BlockState, BakedModel> createBlockStateToModelDispatch(Map<M
5758
return Map.of();
5859
}
5960

60-
@Inject(method = "apply", at = @At("RETURN"))
61-
private void createModelProvider(ModelManager.ReloadState reloadState, ProfilerFiller profiler, CallbackInfo ci) {
62-
this.mfix$modelProvider = new DynamicModelProvider(
63-
null, // TODO
64-
this.missingModel,
65-
this.missingItemModel,
66-
Minecraft.getInstance().getResourceManager(),
67-
this.entityModelSet,
68-
reloadState.atlasPreparations()
69-
);
61+
@ModifyArg(method = "reload", at = @At(value = "INVOKE", target = "Ljava/util/concurrent/CompletableFuture;allOf([Ljava/util/concurrent/CompletableFuture;)Ljava/util/concurrent/CompletableFuture;", ordinal = 1))
62+
private CompletableFuture<?>[] createModelProvider(CompletableFuture<?>[] cfs, @Local(ordinal = 0) CompletableFuture<EntityModelSet> entityModelFuture, @Local(ordinal = 0, argsOnly = true) Executor executor, @Local(ordinal = 0) Map<ResourceLocation, CompletableFuture<AtlasSet.StitchResult>> atlasPreparations) {
63+
CompletableFuture<Void> makeModelProviderFuture = CompletableFuture.supplyAsync(() -> {
64+
return Map.copyOf(Maps.transformValues(atlasPreparations, CompletableFuture::join));
65+
}, executor).thenAcceptBoth(entityModelFuture, (stitchResults, entityModelSet) -> {
66+
this.mfix$modelProvider = new DynamicModelProvider(
67+
Minecraft.getInstance().getResourceManager(),
68+
entityModelSet,
69+
stitchResults
70+
);
71+
DynamicModelProvider.currentReloadingModelProvider = new WeakReference<>(this.mfix$modelProvider);
72+
});
73+
return ArrayUtils.add(cfs, makeModelProviderFuture);
7074
}
7175

7276
/**
@@ -99,4 +103,9 @@ public ItemModel getItemModel(ResourceLocation resourceLocation) {
99103
public ClientItem.Properties getItemProperties(ResourceLocation resourceLocation) {
100104
return this.mfix$modelProvider.getClientItemProperties(resourceLocation);
101105
}
106+
107+
@Override
108+
public DynamicModelProvider mfix$getModelProvider() {
109+
return this.mfix$modelProvider;
110+
}
102111
}

0 commit comments

Comments
 (0)