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