22
33import com .google .common .collect .ImmutableSet ;
44import com .mojang .math .Transformation ;
5+ import it .unimi .dsi .fastutil .objects .Object2ObjectMaps ;
56import it .unimi .dsi .fastutil .objects .Object2ObjectOpenHashMap ;
67import net .minecraft .client .renderer .block .model .BakedQuad ;
78import net .minecraft .client .renderer .block .model .ItemOverrides ;
@@ -38,7 +39,8 @@ public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedMod
3839 public static DynamicBakedModelProvider currentInstance = null ;
3940 private final ModelBakery bakery ;
4041 private final Map <Triple <ResourceLocation , Transformation , Boolean >, BakedModel > bakedCache ;
41- private final Map <ResourceLocation , BakedModel > permanentOverrides ;
42+ private volatile Map <ResourceLocation , BakedModel > permanentOverridesView = null ;
43+ private final Map <ResourceLocation , BakedModel > permanentOverridesMutable ;
4244 private BakedModel missingModel ;
4345 private static final BakedModel SENTINEL = new BakedModel () {
4446 @ Override
@@ -85,7 +87,7 @@ public ItemOverrides getOverrides() {
8587 public DynamicBakedModelProvider (ModelBakery bakery , Map <Triple <ResourceLocation , Transformation , Boolean >, BakedModel > cache ) {
8688 this .bakery = bakery ;
8789 this .bakedCache = cache ;
88- this .permanentOverrides = Collections . synchronizedMap ( new Object2ObjectOpenHashMap <>() );
90+ this .permanentOverridesMutable = new Object2ObjectOpenHashMap <>();
8991 if (currentInstance == null )
9092 currentInstance = this ;
9193 }
@@ -107,14 +109,27 @@ public boolean isEmpty() {
107109 return bakedCache .isEmpty ();
108110 }
109111
112+ private Map <ResourceLocation , BakedModel > getPermanentOverrides () {
113+ Map <ResourceLocation , BakedModel > map = permanentOverridesView ;
114+ if (map == null ) {
115+ synchronized (this ) {
116+ map = permanentOverridesView ;
117+ if (map == null ) {
118+ permanentOverridesView = map = Object2ObjectMaps .unmodifiable (new Object2ObjectOpenHashMap <>(permanentOverridesMutable ));
119+ }
120+ }
121+ }
122+ return map ;
123+ }
124+
110125 @ Override
111126 public boolean containsKey (Object o ) {
112- return permanentOverrides .getOrDefault (o , SENTINEL ) != null ;
127+ return getPermanentOverrides () .getOrDefault (o , SENTINEL ) != null ;
113128 }
114129
115130 @ Override
116131 public boolean containsValue (Object o ) {
117- return permanentOverrides .containsValue (o ) || bakedCache .containsValue (o );
132+ return getPermanentOverrides () .containsValue (o ) || bakedCache .containsValue (o );
118133 }
119134
120135 private static boolean isVanillaTopLevelModel (ResourceLocation location ) {
@@ -140,7 +155,7 @@ private static boolean isVanillaTopLevelModel(ResourceLocation location) {
140155
141156 @ Override
142157 public BakedModel get (Object o ) {
143- BakedModel model = permanentOverrides .getOrDefault (o , SENTINEL );
158+ BakedModel model = getPermanentOverrides () .getOrDefault (o , SENTINEL );
144159 if (model != SENTINEL )
145160 return model ;
146161 else {
@@ -156,15 +171,19 @@ public BakedModel get(Object o) {
156171 if (model == missingModel ) {
157172 // to correctly emulate the original map, we return null for missing models, unless they are top-level
158173 model = isVanillaTopLevelModel ((ResourceLocation )o ) ? model : null ;
159- permanentOverrides .put ((ResourceLocation ) o , model );
174+ this .put ((ResourceLocation ) o , model );
160175 }
161176 return model ;
162177 }
163178 }
164179
165180 @ Override
166181 public BakedModel put (ResourceLocation resourceLocation , BakedModel bakedModel ) {
167- BakedModel m = permanentOverrides .put (resourceLocation , bakedModel );
182+ BakedModel m ;
183+ synchronized (this ) {
184+ m = permanentOverridesMutable .put (resourceLocation , bakedModel );
185+ permanentOverridesView = null ;
186+ }
168187 if (m != null )
169188 return m ;
170189 else
@@ -173,15 +192,22 @@ public BakedModel put(ResourceLocation resourceLocation, BakedModel bakedModel)
173192
174193 @ Override
175194 public BakedModel remove (Object o ) {
176- BakedModel m = permanentOverrides .remove (o );
195+ BakedModel m ;
196+ synchronized (this ) {
197+ m = permanentOverridesMutable .remove (o );
198+ permanentOverridesView = null ;
199+ }
177200 if (m != null )
178201 return m ;
179202 return bakedCache .remove (vanillaKey (o ));
180203 }
181204
182205 @ Override
183206 public void putAll (@ NotNull Map <? extends ResourceLocation , ? extends BakedModel > map ) {
184- permanentOverrides .putAll (map );
207+ synchronized (this ) {
208+ permanentOverridesMutable .putAll (map );
209+ permanentOverridesView = null ;
210+ }
185211 }
186212
187213 @ Override
@@ -210,23 +236,27 @@ public Set<Entry<ResourceLocation, BakedModel>> entrySet() {
210236 @ Nullable
211237 @ Override
212238 public BakedModel replace (ResourceLocation key , BakedModel value ) {
213- BakedModel existingOverride = permanentOverrides .get (key );
214- // as long as no valid override was put in (null can mean unable to load model, so we treat as invalid), replace
215- // the model
216- if (existingOverride == null )
217- return this .put (key , value );
218- else
219- return existingOverride ;
239+ synchronized (this ) {
240+ BakedModel existingOverride = permanentOverridesMutable .get (key );
241+ // as long as no valid override was put in (null can mean unable to load model, so we treat as invalid), replace
242+ // the model
243+ if (existingOverride == null )
244+ return this .put (key , value );
245+ else
246+ return existingOverride ;
247+ }
220248 }
221249
222250 @ Override
223251 public void replaceAll (BiFunction <? super ResourceLocation , ? super BakedModel , ? extends BakedModel > function ) {
224- Set <ResourceLocation > overridenLocations = permanentOverrides .keySet ();
225- permanentOverrides .replaceAll (function );
252+ synchronized (this ) {
253+ permanentOverridesMutable .replaceAll (function );
254+ permanentOverridesView = null ;
255+ }
226256 boolean uvLock = BlockModelRotation .X0_Y0 .isUvLocked ();
227257 Transformation rotation = BlockModelRotation .X0_Y0 .getRotation ();
228258 bakedCache .replaceAll ((loc , oldModel ) -> {
229- if (loc .getMiddle () != rotation || loc .getRight () != uvLock || overridenLocations . contains (loc .getLeft ()))
259+ if (loc .getMiddle () != rotation || loc .getRight () != uvLock || getPermanentOverrides (). containsKey (loc .getLeft ()))
230260 return oldModel ;
231261 else
232262 return function .apply (loc .getLeft (), oldModel );
0 commit comments