diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java index 41acc85f8..4a41876b5 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java @@ -1,5 +1,8 @@ package com.raoulvdberge.refinedstorage.render; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.raoulvdberge.refinedstorage.block.BlockBase; import com.raoulvdberge.refinedstorage.block.BlockDiskDrive; import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; @@ -21,11 +24,38 @@ import java.util.List; import java.util.Map; public class BakedModelDiskDrive implements IBakedModel { + class CacheKey { + private IBlockState state; + private EnumFacing side; + private Integer[] diskState; + + CacheKey(IBlockState state, EnumFacing side, Integer[] diskState) { + this.state = state; + this.side = side; + this.diskState = diskState; + } + } + private IBakedModel base; private Map models = new HashMap<>(); private Map>> disks = new HashMap<>(); - private Map> cache = new HashMap<>(); + private LoadingCache> cache = CacheBuilder.newBuilder().build(new CacheLoader>() { + @Override + public List load(CacheKey key) throws Exception { + EnumFacing facing = key.state.getValue(BlockBase.DIRECTION); + + List quads = models.get(facing).getQuads(key.state, key.side, 0); + + for (int i = 0; i < 8; ++i) { + if (key.diskState[i] != TileDiskDrive.DISK_STATE_NONE) { + quads.addAll(disks.get(facing).get(key.diskState[i]).get(i).getQuads(key.state, key.side, 0)); + } + } + + return quads; + } + }); public BakedModelDiskDrive(IBakedModel base, IBakedModel disk, IBakedModel diskFull, IBakedModel diskDisconnected) { this.base = base; @@ -45,15 +75,6 @@ public class BakedModelDiskDrive implements IBakedModel { } } - private int getCacheKey(EnumFacing direction, EnumFacing side, Integer[] diskState) { - int result = direction.hashCode(); - result = 31 * result + side.hashCode(); - for (Integer state : diskState) { - result = 31 * result + Integer.hashCode(state + 1); - } - return result; - } - private void initDiskModels(IBakedModel disk, int type, EnumFacing facing) { for (int y = 0; y < 4; ++y) { for (int x = 0; x < 2; ++x) { @@ -82,7 +103,6 @@ public class BakedModelDiskDrive implements IBakedModel { return base.getQuads(state, side, rand); } - EnumFacing facing = state.getValue(BlockBase.DIRECTION); Integer[] diskState = ((IExtendedBlockState) state).getValue(BlockDiskDrive.DISK_STATE); if (diskState == null) { @@ -95,21 +115,9 @@ public class BakedModelDiskDrive implements IBakedModel { } } - int cacheKey = getCacheKey(facing, side, diskState); + CacheKey key = new CacheKey(((IExtendedBlockState) state).getClean(), side, diskState); - if (!cache.containsKey(cacheKey)) { - List quads = models.get(facing).getQuads(state, side, rand); - - for (int i = 0; i < 8; ++i) { - if (diskState[i] != TileDiskDrive.DISK_STATE_NONE) { - quads.addAll(disks.get(facing).get(diskState[i]).get(i).getQuads(state, side, rand)); - } - } - - cache.put(cacheKey, quads); - } - - return cache.get(cacheKey); + return cache.getUnchecked(key); } @Override