Use cachebuilder instead, still doesn't work

This commit is contained in:
Raoul Van den Berge
2016-10-24 20:05:26 +02:00
parent dbe02e42c6
commit 5dad275b8c

View File

@@ -1,5 +1,8 @@
package com.raoulvdberge.refinedstorage.render; 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.BlockBase;
import com.raoulvdberge.refinedstorage.block.BlockDiskDrive; import com.raoulvdberge.refinedstorage.block.BlockDiskDrive;
import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; import com.raoulvdberge.refinedstorage.tile.TileDiskDrive;
@@ -21,11 +24,38 @@ import java.util.List;
import java.util.Map; import java.util.Map;
public class BakedModelDiskDrive implements IBakedModel { 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 IBakedModel base;
private Map<EnumFacing, IBakedModel> models = new HashMap<>(); private Map<EnumFacing, IBakedModel> models = new HashMap<>();
private Map<EnumFacing, Map<Integer, List<IBakedModel>>> disks = new HashMap<>(); private Map<EnumFacing, Map<Integer, List<IBakedModel>>> disks = new HashMap<>();
private Map<Integer, List<BakedQuad>> cache = new HashMap<>(); private LoadingCache<CacheKey, List<BakedQuad>> cache = CacheBuilder.newBuilder().build(new CacheLoader<CacheKey, List<BakedQuad>>() {
@Override
public List<BakedQuad> load(CacheKey key) throws Exception {
EnumFacing facing = key.state.getValue(BlockBase.DIRECTION);
List<BakedQuad> 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) { public BakedModelDiskDrive(IBakedModel base, IBakedModel disk, IBakedModel diskFull, IBakedModel diskDisconnected) {
this.base = base; 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) { private void initDiskModels(IBakedModel disk, int type, EnumFacing facing) {
for (int y = 0; y < 4; ++y) { for (int y = 0; y < 4; ++y) {
for (int x = 0; x < 2; ++x) { for (int x = 0; x < 2; ++x) {
@@ -82,7 +103,6 @@ public class BakedModelDiskDrive implements IBakedModel {
return base.getQuads(state, side, rand); return base.getQuads(state, side, rand);
} }
EnumFacing facing = state.getValue(BlockBase.DIRECTION);
Integer[] diskState = ((IExtendedBlockState) state).getValue(BlockDiskDrive.DISK_STATE); Integer[] diskState = ((IExtendedBlockState) state).getValue(BlockDiskDrive.DISK_STATE);
if (diskState == null) { 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)) { return cache.getUnchecked(key);
List<BakedQuad> 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);
} }
@Override @Override