From dbe02e42c676f7a12a172d5bf0d720dbeca285e2 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Sun, 23 Oct 2016 23:38:43 +0200 Subject: [PATCH] Caching of disk drive model, doesn't work --- .../render/BakedModelDiskDrive.java | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java index 93c68569a..41acc85f8 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java @@ -25,6 +25,8 @@ public class BakedModelDiskDrive implements IBakedModel { private Map models = new HashMap<>(); private Map>> disks = new HashMap<>(); + private Map> cache = new HashMap<>(); + public BakedModelDiskDrive(IBakedModel base, IBakedModel disk, IBakedModel diskFull, IBakedModel diskDisconnected) { this.base = base; @@ -43,6 +45,15 @@ 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) { @@ -67,24 +78,38 @@ public class BakedModelDiskDrive implements IBakedModel { @Override public List getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) { - if (!(state instanceof IExtendedBlockState)) { + if (!(state instanceof IExtendedBlockState) || side == null) { return base.getQuads(state, side, rand); } EnumFacing facing = state.getValue(BlockBase.DIRECTION); Integer[] diskState = ((IExtendedBlockState) state).getValue(BlockDiskDrive.DISK_STATE); - List quads = models.get(facing).getQuads(state, side, rand); + if (diskState == null) { + return base.getQuads(state, side, rand); + } - if (diskState != null) { - for (int i = 0; i < 8; ++i) { - if (diskState[i] != null && diskState[i] != TileDiskDrive.DISK_STATE_NONE) { - quads.addAll(disks.get(facing).get(diskState[i]).get(i).getQuads(state, side, rand)); - } + for (Integer individualState : diskState) { + if (individualState == null) { + return base.getQuads(state, side, rand); } } - return quads; + int cacheKey = getCacheKey(facing, 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); } @Override