From e2e5eed35143e301a6e5d5a44a875e0dbece12be Mon Sep 17 00:00:00 2001 From: Rongmario Date: Wed, 24 May 2023 11:26:24 +0100 Subject: [PATCH] Properly discard caches when reloading models (#278) * Properly discard caches when reloading models * Singleton reloading multiple AutoRotatingModels --- .../java/appeng/bootstrap/BlockRendering.java | 34 +++++++++++++++++-- .../render/cablebus/CableBusBakedModel.java | 2 +- .../client/render/cablebus/CableBusModel.java | 15 +++++++- .../render/model/AutoRotatingModel.java | 9 ++++- 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/main/java/appeng/bootstrap/BlockRendering.java b/src/main/java/appeng/bootstrap/BlockRendering.java index aaa095849..519694ba4 100644 --- a/src/main/java/appeng/bootstrap/BlockRendering.java +++ b/src/main/java/appeng/bootstrap/BlockRendering.java @@ -25,21 +25,31 @@ import appeng.bootstrap.components.StateMapperComponent; import appeng.bootstrap.components.TesrComponent; import appeng.client.render.model.AutoRotatingModel; import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.statemap.IStateMapper; import net.minecraft.client.renderer.color.IBlockColor; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.client.resources.IReloadableResourceManager; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.resources.IResourceManagerReloadListener; import net.minecraftforge.client.model.IModel; +import net.minecraftforge.client.resource.IResourceType; +import net.minecraftforge.client.resource.ISelectiveResourceReloadListener; +import net.minecraftforge.client.resource.VanillaResourceType; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.BiFunction; +import java.util.function.Predicate; -class BlockRendering implements IBlockRendering { +class BlockRendering implements IBlockRendering, ISelectiveResourceReloadListener { @SideOnly(Side.CLIENT) private BiFunction modelCustomizer; @@ -56,6 +66,13 @@ class BlockRendering implements IBlockRendering { @SideOnly(Side.CLIENT) private final Map builtInModels = new HashMap<>(); + @SideOnly(Side.CLIENT) + private final List reloads = new ArrayList<>(); + + BlockRendering() { + ((IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager()).registerReloadListener(this); + } + @Override @SideOnly(Side.CLIENT) public IBlockRendering modelCustomizer(BiFunction customizer) { @@ -103,7 +120,11 @@ class BlockRendering implements IBlockRendering { } else if (block instanceof AEBaseTileBlock) { // This is a default rotating model if the base-block uses an AE tile entity which exposes UP/FRONT as // extended props - factory.addModelOverride(block.getRegistryName().getResourcePath(), (l, m) -> new AutoRotatingModel(m)); + factory.addModelOverride(block.getRegistryName().getResourcePath(), (l, m) -> { + AutoRotatingModel model = new AutoRotatingModel(m); + BlockRendering.this.reloads.add(model); + return model; + }); } // TODO : 1.12 @@ -117,4 +138,13 @@ class BlockRendering implements IBlockRendering { factory.addBootstrapComponent(new StateMapperComponent(block, this.stateMapper)); } } + + @Override + @SideOnly(Side.CLIENT) + public void onResourceManagerReload(IResourceManager resourceManager, Predicate resourcePredicate) { + if (resourcePredicate.test(VanillaResourceType.MODELS)) { + this.reloads.forEach(listener -> listener.onResourceManagerReload(resourceManager)); + } + } + } diff --git a/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java b/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java index 65d3edea9..2f0795045 100644 --- a/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java +++ b/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java @@ -45,7 +45,7 @@ import java.util.Map.Entry; public class CableBusBakedModel implements IBakedModel { - private static final Map> CABLE_MODEL_CACHE = new HashMap<>(); + static final Map> CABLE_MODEL_CACHE = new HashMap<>(); private final CableBuilder cableBuilder; diff --git a/src/main/java/appeng/client/render/cablebus/CableBusModel.java b/src/main/java/appeng/client/render/cablebus/CableBusModel.java index 8dcc9c836..692c6e632 100644 --- a/src/main/java/appeng/client/render/cablebus/CableBusModel.java +++ b/src/main/java/appeng/client/render/cablebus/CableBusModel.java @@ -27,21 +27,26 @@ import com.google.common.collect.ImmutableMap; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.client.resources.IResourceManager; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModel; import net.minecraftforge.client.model.ModelLoaderRegistry; +import net.minecraftforge.client.resource.IResourceType; +import net.minecraftforge.client.resource.ISelectiveResourceReloadListener; +import net.minecraftforge.client.resource.VanillaResourceType; import net.minecraftforge.common.model.IModelState; import net.minecraftforge.common.model.TRSRTransformation; import java.util.Collection; import java.util.Map; import java.util.function.Function; +import java.util.function.Predicate; /** * The built-in model for the cable bus block. */ -public class CableBusModel implements IModel { +public class CableBusModel implements IModel, ISelectiveResourceReloadListener { private final PartModels partModels; @@ -101,4 +106,12 @@ public class CableBusModel implements IModel { public IModelState getDefaultState() { return TRSRTransformation.identity(); } + + @Override + public void onResourceManagerReload(IResourceManager resourceManager, Predicate resourcePredicate) { + if (resourcePredicate.test(VanillaResourceType.MODELS)) { + CableBusBakedModel.CABLE_MODEL_CACHE.clear(); + } + } + } diff --git a/src/main/java/appeng/client/render/model/AutoRotatingModel.java b/src/main/java/appeng/client/render/model/AutoRotatingModel.java index c11e96150..2c058374e 100644 --- a/src/main/java/appeng/client/render/model/AutoRotatingModel.java +++ b/src/main/java/appeng/client/render/model/AutoRotatingModel.java @@ -33,6 +33,8 @@ import net.minecraft.client.renderer.block.model.ItemOverrideList; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormatElement; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.resources.IResourceManagerReloadListener; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.Vec3i; import net.minecraftforge.client.model.pipeline.IVertexConsumer; @@ -46,7 +48,7 @@ import java.util.ArrayList; import java.util.List; -public class AutoRotatingModel implements IBakedModel { +public class AutoRotatingModel implements IBakedModel, IResourceManagerReloadListener { private final IBakedModel parent; private final LoadingCache> quadCache; @@ -152,6 +154,11 @@ public class AutoRotatingModel implements IBakedModel { return this.quadCache.getUnchecked(key); } + @Override + public void onResourceManagerReload(IResourceManager resourceManager) { + this.quadCache.invalidateAll(); + } + public static class VertexRotator extends QuadGatheringTransformer { private final FacingToRotation f2r; private final EnumFacing face;