Use LoadingCache instead of HashMap for CableBusBakedModel (#385)
This commit is contained in:
@@ -24,6 +24,10 @@ import appeng.api.parts.IPartModel;
|
|||||||
import appeng.api.util.AECableType;
|
import appeng.api.util.AECableType;
|
||||||
import appeng.api.util.AEColor;
|
import appeng.api.util.AEColor;
|
||||||
import appeng.block.networking.BlockCableBus;
|
import appeng.block.networking.BlockCableBus;
|
||||||
|
import com.google.common.cache.CacheBuilder;
|
||||||
|
import com.google.common.cache.CacheLoader;
|
||||||
|
import com.google.common.cache.LoadingCache;
|
||||||
|
import com.google.common.cache.Weigher;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.block.model.BakedQuad;
|
import net.minecraft.client.renderer.block.model.BakedQuad;
|
||||||
@@ -38,6 +42,7 @@ import net.minecraft.util.ResourceLocation;
|
|||||||
import net.minecraftforge.client.MinecraftForgeClient;
|
import net.minecraftforge.client.MinecraftForgeClient;
|
||||||
import net.minecraftforge.common.property.IExtendedBlockState;
|
import net.minecraftforge.common.property.IExtendedBlockState;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
@@ -45,8 +50,6 @@ import java.util.Map.Entry;
|
|||||||
|
|
||||||
public class CableBusBakedModel implements IBakedModel {
|
public class CableBusBakedModel implements IBakedModel {
|
||||||
|
|
||||||
static final Map<CableBusRenderState, List<BakedQuad>> CABLE_MODEL_CACHE = new HashMap<>();
|
|
||||||
|
|
||||||
private final CableBuilder cableBuilder;
|
private final CableBuilder cableBuilder;
|
||||||
|
|
||||||
private final FacadeBuilder facadeBuilder;
|
private final FacadeBuilder facadeBuilder;
|
||||||
@@ -57,11 +60,24 @@ public class CableBusBakedModel implements IBakedModel {
|
|||||||
|
|
||||||
private final TextureMap textureMap = Minecraft.getMinecraft().getTextureMapBlocks();
|
private final TextureMap textureMap = Minecraft.getMinecraft().getTextureMapBlocks();
|
||||||
|
|
||||||
|
private final LoadingCache<CableBusRenderState, List<BakedQuad>> cableModelCache;
|
||||||
|
|
||||||
CableBusBakedModel(CableBuilder cableBuilder, FacadeBuilder facadeBuilder, Map<ResourceLocation, IBakedModel> partModels, TextureAtlasSprite particleTexture) {
|
CableBusBakedModel(CableBuilder cableBuilder, FacadeBuilder facadeBuilder, Map<ResourceLocation, IBakedModel> partModels, TextureAtlasSprite particleTexture) {
|
||||||
this.cableBuilder = cableBuilder;
|
this.cableBuilder = cableBuilder;
|
||||||
this.facadeBuilder = facadeBuilder;
|
this.facadeBuilder = facadeBuilder;
|
||||||
this.partModels = partModels;
|
this.partModels = partModels;
|
||||||
this.particleTexture = particleTexture;
|
this.particleTexture = particleTexture;
|
||||||
|
this.cableModelCache = CacheBuilder.newBuilder()
|
||||||
|
.maximumWeight(5000)
|
||||||
|
.weigher((Weigher<CableBusRenderState, List<BakedQuad>>) (k, v) -> v.size())
|
||||||
|
.build(new CacheLoader<>() {
|
||||||
|
@Override
|
||||||
|
public List<BakedQuad> load(@Nonnull CableBusRenderState rs) {
|
||||||
|
final List<BakedQuad> model = new ArrayList<>();
|
||||||
|
addCableQuads(rs, model);
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -82,12 +98,7 @@ public class CableBusBakedModel implements IBakedModel {
|
|||||||
if (layer == BlockRenderLayer.CUTOUT) {
|
if (layer == BlockRenderLayer.CUTOUT) {
|
||||||
|
|
||||||
// First, handle the cable at the center of the cable bus
|
// First, handle the cable at the center of the cable bus
|
||||||
final List<BakedQuad> cableModel = CABLE_MODEL_CACHE.computeIfAbsent(renderState, k ->
|
final List<BakedQuad> cableModel = cableModelCache.getUnchecked(renderState);
|
||||||
{
|
|
||||||
final List<BakedQuad> model = new ArrayList<>();
|
|
||||||
this.addCableQuads(renderState, model);
|
|
||||||
return model;
|
|
||||||
});
|
|
||||||
quads.addAll(cableModel);
|
quads.addAll(cableModel);
|
||||||
|
|
||||||
// Then handle attachments
|
// Then handle attachments
|
||||||
|
|||||||
@@ -27,26 +27,21 @@ import com.google.common.collect.ImmutableMap;
|
|||||||
import net.minecraft.client.renderer.block.model.IBakedModel;
|
import net.minecraft.client.renderer.block.model.IBakedModel;
|
||||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||||
import net.minecraft.client.renderer.vertex.VertexFormat;
|
import net.minecraft.client.renderer.vertex.VertexFormat;
|
||||||
import net.minecraft.client.resources.IResourceManager;
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import net.minecraftforge.client.model.IModel;
|
import net.minecraftforge.client.model.IModel;
|
||||||
import net.minecraftforge.client.model.ModelLoaderRegistry;
|
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.IModelState;
|
||||||
import net.minecraftforge.common.model.TRSRTransformation;
|
import net.minecraftforge.common.model.TRSRTransformation;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The built-in model for the cable bus block.
|
* The built-in model for the cable bus block.
|
||||||
*/
|
*/
|
||||||
public class CableBusModel implements IModel, ISelectiveResourceReloadListener {
|
public class CableBusModel implements IModel {
|
||||||
|
|
||||||
private final PartModels partModels;
|
private final PartModels partModels;
|
||||||
|
|
||||||
@@ -106,12 +101,4 @@ public class CableBusModel implements IModel, ISelectiveResourceReloadListener {
|
|||||||
public IModelState getDefaultState() {
|
public IModelState getDefaultState() {
|
||||||
return TRSRTransformation.identity();
|
return TRSRTransformation.identity();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResourceManagerReload(IResourceManager resourceManager, Predicate<IResourceType> resourcePredicate) {
|
|
||||||
if (resourcePredicate.test(VanillaResourceType.MODELS)) {
|
|
||||||
CableBusBakedModel.CABLE_MODEL_CACHE.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user