From 81baeea35b7c1adc6cea4c5ad3ce0db54eef06c2 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 28 Oct 2023 20:12:14 -0400 Subject: [PATCH 1/2] Support earlyy baking models on Forge as well Fixes FFAPI model provider hooks not running --- .../mixin/perf/dynamic_resources/ModelBakeryMixin.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java index b1d684c2..99f1ebe5 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -183,8 +183,11 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { } @Redirect(method = "bakeModels", at = @At(value = "INVOKE", target = "Ljava/util/Map;keySet()Ljava/util/Set;")) - private Set skipBakingModels(Map map) { - return Collections.emptySet(); + private Set skipBakingModels(Map instance) { + Set modelSet = new HashSet<>(instance.keySet()); + if(modelSet.size() > 0) + ModernFix.LOGGER.info("Early baking {} models", modelSet.size()); + return modelSet; } /** From 621ecf6b3ee8314a7c55c460270e943ad2d4c9de Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 29 Oct 2023 11:35:46 -0400 Subject: [PATCH 2/2] Use copy-on-write map for permanent overrides --- .../DynamicBakedModelProvider.java | 68 +++++++++++++------ 1 file changed, 49 insertions(+), 19 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java index 456ceea7..5e7f2f63 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java @@ -2,6 +2,7 @@ package org.embeddedt.modernfix.dynamicresources; import com.google.common.collect.ImmutableSet; import com.mojang.math.Transformation; +import it.unimi.dsi.fastutil.objects.Object2ObjectMaps; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.ItemOverrides; @@ -38,7 +39,8 @@ public class DynamicBakedModelProvider implements Map, BakedModel> bakedCache; - private final Map permanentOverrides; + private volatile Map permanentOverridesView = null; + private final Map permanentOverridesMutable; private BakedModel missingModel; private static final BakedModel SENTINEL = new BakedModel() { @Override @@ -85,7 +87,7 @@ public class DynamicBakedModelProvider implements Map, BakedModel> cache) { this.bakery = bakery; this.bakedCache = cache; - this.permanentOverrides = Collections.synchronizedMap(new Object2ObjectOpenHashMap<>()); + this.permanentOverridesMutable = new Object2ObjectOpenHashMap<>(); if(currentInstance == null) currentInstance = this; } @@ -107,14 +109,27 @@ public class DynamicBakedModelProvider implements Map getPermanentOverrides() { + Map map = permanentOverridesView; + if(map == null) { + synchronized (this) { + map = permanentOverridesView; + if(map == null) { + permanentOverridesView = map = Object2ObjectMaps.unmodifiable(new Object2ObjectOpenHashMap<>(permanentOverridesMutable)); + } + } + } + return map; + } + @Override public boolean containsKey(Object o) { - return permanentOverrides.getOrDefault(o, SENTINEL) != null; + return getPermanentOverrides().getOrDefault(o, SENTINEL) != null; } @Override 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) { @@ -140,7 +155,7 @@ public class DynamicBakedModelProvider implements Map map) { - permanentOverrides.putAll(map); + synchronized (this) { + permanentOverridesMutable.putAll(map); + permanentOverridesView = null; + } } @Override @@ -210,23 +236,27 @@ public class DynamicBakedModelProvider implements Map function) { - Set overridenLocations = permanentOverrides.keySet(); - permanentOverrides.replaceAll(function); + synchronized (this) { + permanentOverridesMutable.replaceAll(function); + permanentOverridesView = null; + } boolean uvLock = BlockModelRotation.X0_Y0.isUvLocked(); Transformation rotation = BlockModelRotation.X0_Y0.getRotation(); 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; else return function.apply(loc.getLeft(), oldModel);