Caching of disk drive model, doesn't work
This commit is contained in:
@@ -25,6 +25,8 @@ public class BakedModelDiskDrive implements IBakedModel {
|
|||||||
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<>();
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
@@ -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) {
|
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) {
|
||||||
@@ -67,24 +78,38 @@ public class BakedModelDiskDrive implements IBakedModel {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) {
|
public List<BakedQuad> 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);
|
return base.getQuads(state, side, rand);
|
||||||
}
|
}
|
||||||
|
|
||||||
EnumFacing facing = state.getValue(BlockBase.DIRECTION);
|
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) {
|
||||||
|
return base.getQuads(state, side, rand);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Integer individualState : diskState) {
|
||||||
|
if (individualState == null) {
|
||||||
|
return base.getQuads(state, side, rand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int cacheKey = getCacheKey(facing, side, diskState);
|
||||||
|
|
||||||
|
if (!cache.containsKey(cacheKey)) {
|
||||||
List<BakedQuad> quads = models.get(facing).getQuads(state, side, rand);
|
List<BakedQuad> quads = models.get(facing).getQuads(state, side, rand);
|
||||||
|
|
||||||
if (diskState != null) {
|
|
||||||
for (int i = 0; i < 8; ++i) {
|
for (int i = 0; i < 8; ++i) {
|
||||||
if (diskState[i] != null && diskState[i] != TileDiskDrive.DISK_STATE_NONE) {
|
if (diskState[i] != TileDiskDrive.DISK_STATE_NONE) {
|
||||||
quads.addAll(disks.get(facing).get(diskState[i]).get(i).getQuads(state, side, rand));
|
quads.addAll(disks.get(facing).get(diskState[i]).get(i).getQuads(state, side, rand));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cache.put(cacheKey, quads);
|
||||||
}
|
}
|
||||||
|
|
||||||
return quads;
|
return cache.get(cacheKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user