11package org .embeddedt .modernfix .common .mixin .perf .dynamic_resources ;
22
33import com .google .common .collect .ImmutableList ;
4+ import it .unimi .dsi .fastutil .objects .Object2IntMap ;
5+ import net .minecraft .client .Minecraft ;
46import net .minecraft .client .renderer .block .model .BlockModel ;
7+ import net .minecraft .client .resources .model .AtlasSet ;
58import net .minecraft .client .resources .model .BakedModel ;
69import net .minecraft .client .resources .model .BlockStateModelLoader ;
10+ import net .minecraft .client .resources .model .ModelBakery ;
711import net .minecraft .client .resources .model .ModelManager ;
12+ import net .minecraft .client .resources .model .ModelResourceLocation ;
813import net .minecraft .resources .ResourceLocation ;
914import net .minecraft .server .packs .resources .ResourceManager ;
15+ import net .minecraft .util .profiling .ProfilerFiller ;
1016import net .minecraft .world .level .block .Block ;
1117import net .minecraft .world .level .block .state .BlockState ;
1218import net .minecraft .world .level .block .state .StateDefinition ;
1319import org .embeddedt .modernfix .annotation .ClientOnlyMixin ;
14- import org .embeddedt .modernfix .duck . IExtendedModelManager ;
20+ import org .embeddedt .modernfix .dynamicresources . DynamicModelProvider ;
1521import org .spongepowered .asm .mixin .Mixin ;
22+ import org .spongepowered .asm .mixin .Overwrite ;
1623import org .spongepowered .asm .mixin .Shadow ;
24+ import org .spongepowered .asm .mixin .Unique ;
1725import org .spongepowered .asm .mixin .injection .At ;
1826import org .spongepowered .asm .mixin .injection .Inject ;
1927import org .spongepowered .asm .mixin .injection .Redirect ;
2028import org .spongepowered .asm .mixin .injection .callback .CallbackInfo ;
29+ import org .spongepowered .asm .mixin .injection .callback .CallbackInfoReturnable ;
2130
2231import java .util .HashMap ;
2332import java .util .Map ;
2635
2736@ Mixin (ModelManager .class )
2837@ ClientOnlyMixin
29- public class ModelManagerMixin implements IExtendedModelManager {
38+ public class ModelManagerMixin {
3039 @ Shadow private Map <ResourceLocation , BakedModel > bakedRegistry ;
3140
41+ @ Shadow private BakedModel missingModel ;
42+ @ Unique
43+ private DynamicModelProvider mfix$modelProvider ;
44+
45+ @ Unique
46+ private Map <ResourceLocation , AtlasSet .StitchResult > mfix$stitchResults ;
47+
3248 @ Inject (method = "<init>" , at = @ At ("RETURN" ))
3349 private void injectDummyBakedRegistry (CallbackInfo ci ) {
3450 if (this .bakedRegistry == null ) {
@@ -51,8 +67,31 @@ private ImmutableList<BlockState> skipCollection(StateDefinition<Block, BlockSta
5167 return ImmutableList .of ();
5268 }
5369
54- @ Override
55- public void mfix$tick () {
70+ @ Inject (method = "loadModels" , at = @ At ("HEAD" ))
71+ private void saveStitchResults (ProfilerFiller profilerFiller , Map <ResourceLocation , AtlasSet .StitchResult > map , ModelBakery modelBakery , Object2IntMap <BlockState > object2IntMap , CallbackInfoReturnable <?> cir ) {
72+ this .mfix$stitchResults = map ;
73+ }
5674
75+ @ Inject (method = "apply" , at = @ At ("RETURN" ))
76+ private void createModelProvider (CallbackInfo ci ) {
77+ this .mfix$modelProvider = new DynamicModelProvider (
78+ null , // TODO
79+ this .missingModel ,
80+ Minecraft .getInstance ().getResourceManager (),
81+ this .mfix$stitchResults
82+ );
83+ }
84+
85+ /**
86+ * @author embeddedt
87+ * @reason use dynamic model system
88+ */
89+ @ Overwrite
90+ public BakedModel getModel (ModelResourceLocation modelLocation ) {
91+ if (this .mfix$modelProvider != null ) {
92+ return this .mfix$modelProvider .getModel (modelLocation );
93+ } else {
94+ return this .missingModel ;
95+ }
5796 }
5897}
0 commit comments