Skip to content

Commit fccbae3

Browse files
committed
Merge 1.16 into 1.18
2 parents 0a72abb + 621ecf6 commit fccbae3

File tree

1 file changed

+49
-19
lines changed

1 file changed

+49
-19
lines changed

common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.common.collect.ImmutableSet;
44
import com.mojang.math.Transformation;
5+
import it.unimi.dsi.fastutil.objects.Object2ObjectMaps;
56
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
67
import net.minecraft.client.renderer.block.model.BakedQuad;
78
import 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

Comments
 (0)