Use cachebuilder instead, still doesn't work
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user