Merge 1.16 into 1.18
This commit is contained in:
commit
fccbae33db
|
|
@ -2,6 +2,7 @@ package org.embeddedt.modernfix.dynamicresources;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.mojang.math.Transformation;
|
import com.mojang.math.Transformation;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2ObjectMaps;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
import net.minecraft.client.renderer.block.model.BakedQuad;
|
import net.minecraft.client.renderer.block.model.BakedQuad;
|
||||||
import net.minecraft.client.renderer.block.model.ItemOverrides;
|
import net.minecraft.client.renderer.block.model.ItemOverrides;
|
||||||
|
|
@ -38,7 +39,8 @@ public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedMod
|
||||||
public static DynamicBakedModelProvider currentInstance = null;
|
public static DynamicBakedModelProvider currentInstance = null;
|
||||||
private final ModelBakery bakery;
|
private final ModelBakery bakery;
|
||||||
private final Map<Triple<ResourceLocation, Transformation, Boolean>, BakedModel> bakedCache;
|
private final Map<Triple<ResourceLocation, Transformation, Boolean>, BakedModel> bakedCache;
|
||||||
private final Map<ResourceLocation, BakedModel> permanentOverrides;
|
private volatile Map<ResourceLocation, BakedModel> permanentOverridesView = null;
|
||||||
|
private final Map<ResourceLocation, BakedModel> permanentOverridesMutable;
|
||||||
private BakedModel missingModel;
|
private BakedModel missingModel;
|
||||||
private static final BakedModel SENTINEL = new BakedModel() {
|
private static final BakedModel SENTINEL = new BakedModel() {
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -85,7 +87,7 @@ public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedMod
|
||||||
public DynamicBakedModelProvider(ModelBakery bakery, Map<Triple<ResourceLocation, Transformation, Boolean>, BakedModel> cache) {
|
public DynamicBakedModelProvider(ModelBakery bakery, Map<Triple<ResourceLocation, Transformation, Boolean>, BakedModel> cache) {
|
||||||
this.bakery = bakery;
|
this.bakery = bakery;
|
||||||
this.bakedCache = cache;
|
this.bakedCache = cache;
|
||||||
this.permanentOverrides = Collections.synchronizedMap(new Object2ObjectOpenHashMap<>());
|
this.permanentOverridesMutable = new Object2ObjectOpenHashMap<>();
|
||||||
if(currentInstance == null)
|
if(currentInstance == null)
|
||||||
currentInstance = this;
|
currentInstance = this;
|
||||||
}
|
}
|
||||||
|
|
@ -107,14 +109,27 @@ public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedMod
|
||||||
return bakedCache.isEmpty();
|
return bakedCache.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Map<ResourceLocation, BakedModel> getPermanentOverrides() {
|
||||||
|
Map<ResourceLocation, BakedModel> map = permanentOverridesView;
|
||||||
|
if(map == null) {
|
||||||
|
synchronized (this) {
|
||||||
|
map = permanentOverridesView;
|
||||||
|
if(map == null) {
|
||||||
|
permanentOverridesView = map = Object2ObjectMaps.unmodifiable(new Object2ObjectOpenHashMap<>(permanentOverridesMutable));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean containsKey(Object o) {
|
public boolean containsKey(Object o) {
|
||||||
return permanentOverrides.getOrDefault(o, SENTINEL) != null;
|
return getPermanentOverrides().getOrDefault(o, SENTINEL) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean containsValue(Object o) {
|
public boolean containsValue(Object o) {
|
||||||
return permanentOverrides.containsValue(o) || bakedCache.containsValue(o);
|
return getPermanentOverrides().containsValue(o) || bakedCache.containsValue(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isVanillaTopLevelModel(ResourceLocation location) {
|
private static boolean isVanillaTopLevelModel(ResourceLocation location) {
|
||||||
|
|
@ -140,7 +155,7 @@ public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedMod
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BakedModel get(Object o) {
|
public BakedModel get(Object o) {
|
||||||
BakedModel model = permanentOverrides.getOrDefault(o, SENTINEL);
|
BakedModel model = getPermanentOverrides().getOrDefault(o, SENTINEL);
|
||||||
if(model != SENTINEL)
|
if(model != SENTINEL)
|
||||||
return model;
|
return model;
|
||||||
else {
|
else {
|
||||||
|
|
@ -156,7 +171,7 @@ public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedMod
|
||||||
if(model == missingModel) {
|
if(model == missingModel) {
|
||||||
// to correctly emulate the original map, we return null for missing models, unless they are top-level
|
// to correctly emulate the original map, we return null for missing models, unless they are top-level
|
||||||
model = isVanillaTopLevelModel((ResourceLocation)o) ? model : null;
|
model = isVanillaTopLevelModel((ResourceLocation)o) ? model : null;
|
||||||
permanentOverrides.put((ResourceLocation) o, model);
|
this.put((ResourceLocation) o, model);
|
||||||
}
|
}
|
||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
@ -164,7 +179,11 @@ public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedMod
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BakedModel put(ResourceLocation resourceLocation, BakedModel bakedModel) {
|
public BakedModel put(ResourceLocation resourceLocation, BakedModel bakedModel) {
|
||||||
BakedModel m = permanentOverrides.put(resourceLocation, bakedModel);
|
BakedModel m;
|
||||||
|
synchronized (this) {
|
||||||
|
m = permanentOverridesMutable.put(resourceLocation, bakedModel);
|
||||||
|
permanentOverridesView = null;
|
||||||
|
}
|
||||||
if(m != null)
|
if(m != null)
|
||||||
return m;
|
return m;
|
||||||
else
|
else
|
||||||
|
|
@ -173,7 +192,11 @@ public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedMod
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BakedModel remove(Object o) {
|
public BakedModel remove(Object o) {
|
||||||
BakedModel m = permanentOverrides.remove(o);
|
BakedModel m;
|
||||||
|
synchronized (this) {
|
||||||
|
m = permanentOverridesMutable.remove(o);
|
||||||
|
permanentOverridesView = null;
|
||||||
|
}
|
||||||
if(m != null)
|
if(m != null)
|
||||||
return m;
|
return m;
|
||||||
return bakedCache.remove(vanillaKey(o));
|
return bakedCache.remove(vanillaKey(o));
|
||||||
|
|
@ -181,7 +204,10 @@ public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedMod
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void putAll(@NotNull Map<? extends ResourceLocation, ? extends BakedModel> map) {
|
public void putAll(@NotNull Map<? extends ResourceLocation, ? extends BakedModel> map) {
|
||||||
permanentOverrides.putAll(map);
|
synchronized (this) {
|
||||||
|
permanentOverridesMutable.putAll(map);
|
||||||
|
permanentOverridesView = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -210,23 +236,27 @@ public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedMod
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public BakedModel replace(ResourceLocation key, BakedModel value) {
|
public BakedModel replace(ResourceLocation key, BakedModel value) {
|
||||||
BakedModel existingOverride = permanentOverrides.get(key);
|
synchronized (this) {
|
||||||
// as long as no valid override was put in (null can mean unable to load model, so we treat as invalid), replace
|
BakedModel existingOverride = permanentOverridesMutable.get(key);
|
||||||
// the model
|
// as long as no valid override was put in (null can mean unable to load model, so we treat as invalid), replace
|
||||||
if(existingOverride == null)
|
// the model
|
||||||
return this.put(key, value);
|
if(existingOverride == null)
|
||||||
else
|
return this.put(key, value);
|
||||||
return existingOverride;
|
else
|
||||||
|
return existingOverride;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void replaceAll(BiFunction<? super ResourceLocation, ? super BakedModel, ? extends BakedModel> function) {
|
public void replaceAll(BiFunction<? super ResourceLocation, ? super BakedModel, ? extends BakedModel> function) {
|
||||||
Set<ResourceLocation> overridenLocations = permanentOverrides.keySet();
|
synchronized (this) {
|
||||||
permanentOverrides.replaceAll(function);
|
permanentOverridesMutable.replaceAll(function);
|
||||||
|
permanentOverridesView = null;
|
||||||
|
}
|
||||||
boolean uvLock = BlockModelRotation.X0_Y0.isUvLocked();
|
boolean uvLock = BlockModelRotation.X0_Y0.isUvLocked();
|
||||||
Transformation rotation = BlockModelRotation.X0_Y0.getRotation();
|
Transformation rotation = BlockModelRotation.X0_Y0.getRotation();
|
||||||
bakedCache.replaceAll((loc, oldModel) -> {
|
bakedCache.replaceAll((loc, oldModel) -> {
|
||||||
if(loc.getMiddle() != rotation || loc.getRight() != uvLock || overridenLocations.contains(loc.getLeft()))
|
if(loc.getMiddle() != rotation || loc.getRight() != uvLock || getPermanentOverrides().containsKey(loc.getLeft()))
|
||||||
return oldModel;
|
return oldModel;
|
||||||
else
|
else
|
||||||
return function.apply(loc.getLeft(), oldModel);
|
return function.apply(loc.getLeft(), oldModel);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user