11package org .embeddedt .modernfix .common .mixin .perf .dynamic_resources ;
22
3- import it .unimi .dsi .fastutil .objects .Reference2ReferenceLinkedOpenHashMap ;
43import net .minecraft .client .renderer .block .BlockModelShaper ;
54import net .minecraft .client .resources .model .BakedModel ;
65import net .minecraft .client .resources .model .ModelManager ;
76import net .minecraft .client .resources .model .ModelResourceLocation ;
7+ import net .minecraft .core .registries .BuiltInRegistries ;
8+ import net .minecraft .world .level .block .Block ;
89import net .minecraft .world .level .block .state .BlockState ;
910import org .embeddedt .modernfix .annotation .ClientOnlyMixin ;
11+ import org .embeddedt .modernfix .duck .IModelHoldingBlockState ;
1012import org .embeddedt .modernfix .dynamicresources .ModelLocationCache ;
1113import org .embeddedt .modernfix .util .DynamicOverridableMap ;
1214import org .spongepowered .asm .mixin .*;
@@ -24,13 +26,18 @@ public class BlockModelShaperMixin {
2426 @ Shadow
2527 private Map <BlockState , BakedModel > modelByStateCache ;
2628
27- private ThreadLocal <Reference2ReferenceLinkedOpenHashMap <BlockState , BakedModel >> mfix$modelCache = ThreadLocal .withInitial (Reference2ReferenceLinkedOpenHashMap ::new );
28-
2929 @ Inject (method = { "<init>" , "replaceCache" }, at = @ At ("RETURN" ))
3030 private void replaceModelMap (CallbackInfo ci ) {
3131 // replace the backing map for mods which will access it
3232 this .modelByStateCache = new DynamicOverridableMap <>(state -> modelManager .getModel (ModelLocationCache .get (state )));
33- this .mfix$modelCache = ThreadLocal .withInitial (Reference2ReferenceLinkedOpenHashMap ::new );
33+ // Clear the cached models on blockstate objects
34+ for (Block block : BuiltInRegistries .BLOCK ) {
35+ for (BlockState state : block .getStateDefinition ().getPossibleStates ()) {
36+ if (state instanceof IModelHoldingBlockState modelHolder ) {
37+ modelHolder .mfix$setModel (null );
38+ }
39+ }
40+ }
3441 }
3542
3643 private BakedModel cacheBlockModel (BlockState state ) {
@@ -50,18 +57,18 @@ private BakedModel cacheBlockModel(BlockState state) {
5057 */
5158 @ Overwrite
5259 public BakedModel getBlockModel (BlockState state ) {
53- Reference2ReferenceLinkedOpenHashMap < BlockState , BakedModel > map = this . mfix$modelCache . get ();
54- BakedModel model = map . get ( state );
60+ if ( state instanceof IModelHoldingBlockState modelHolder ) {
61+ BakedModel model = modelHolder . mfix$getModel ( );
5562
56- if (model != null ) {
57- return model ;
58- }
63+ if (model != null ) {
64+ return model ;
65+ }
5966
60- model = this .cacheBlockModel (state );
61- map .putAndMoveToFirst (state , model );
62- if (map .size () > 500 ) {
63- map .removeLast ();
67+ model = this .cacheBlockModel (state );
68+ modelHolder .mfix$setModel (model );
69+ return model ;
70+ } else {
71+ return this .cacheBlockModel (state );
6472 }
65- return model ;
6673 }
6774}
0 commit comments