Increase rendering performance of cover items.

This commit is contained in:
raoulvdberge
2018-07-04 21:02:53 +02:00
parent c3a8484190
commit 61426b5545

View File

@@ -1,5 +1,8 @@
package com.raoulvdberge.refinedstorage.render.model.baked; package com.raoulvdberge.refinedstorage.render.model.baked;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.cover.CoverManager; import com.raoulvdberge.refinedstorage.apiimpl.network.node.cover.CoverManager;
import com.raoulvdberge.refinedstorage.item.ItemCover; import com.raoulvdberge.refinedstorage.item.ItemCover;
import com.raoulvdberge.refinedstorage.render.QuadBuilder; import com.raoulvdberge.refinedstorage.render.QuadBuilder;
@@ -23,34 +26,61 @@ import javax.vecmath.Matrix4f;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects;
public class BakedModelCover implements IBakedModel { public class BakedModelCover implements IBakedModel {
@Nullable private class CacheKey {
private ItemStack stack;
private IBakedModel base; private IBakedModel base;
private IBlockState state;
private ItemStack stack;
private EnumFacing side;
public BakedModelCover(IBakedModel base, @Nullable ItemStack stack) { CacheKey(IBakedModel base, IBlockState state, ItemStack stack, EnumFacing side) {
this.base = base; this.base = base;
this.state = state;
this.stack = stack; this.stack = stack;
this.side = side;
} }
@Override @Override
public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) { public boolean equals(Object o) {
List<BakedQuad> quads = new ArrayList<>(base.getQuads(state, side, rand)); if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
BakedModelCover.CacheKey cacheKey = (BakedModelCover.CacheKey) o;
return cacheKey.stack.getItem() == stack.getItem() && cacheKey.stack.getItemDamage() == stack.getItemDamage() && cacheKey.side == side && Objects.equals(cacheKey.state, state);
}
@Override
public int hashCode() {
int result = stack.getItem().hashCode();
result = 31 * result + stack.getItemDamage();
result = 31 * result + (side != null ? side.hashCode() : 0);
result = 31 * result + (state != null ? state.hashCode() : 0);
return result;
}
}
private static final LoadingCache<CacheKey, List<BakedQuad>> CACHE = CacheBuilder.newBuilder().build(new CacheLoader<CacheKey, List<BakedQuad>>() {
@Override
public List<BakedQuad> load(CacheKey key) {
List<BakedQuad> quads = new ArrayList<>(key.base.getQuads(key.state, key.side, 0));
TextureAtlasSprite sprite = Minecraft.getMinecraft().getTextureMapBlocks().getMissingSprite(); TextureAtlasSprite sprite = Minecraft.getMinecraft().getTextureMapBlocks().getMissingSprite();
if (stack != null) { if (!key.stack.isEmpty()) {
ItemStack item = ItemCover.getItem(stack); IBlockState coverState = CoverManager.getBlockState(key.stack);
if (!item.isEmpty()) {
IBlockState coverState = CoverManager.getBlockState(item);
if (coverState != null) { if (coverState != null) {
IBakedModel coverModel = Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState(coverState); IBakedModel coverModel = Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState(coverState);
sprite = BakedModelCableCover.getSprite(coverModel, coverState, side, rand); sprite = BakedModelCableCover.getSprite(coverModel, coverState, key.side, 0);
}
} }
} }
@@ -71,6 +101,27 @@ public class BakedModelCover implements IBakedModel {
return quads; return quads;
} }
});
@Nullable
private ItemStack stack;
private IBakedModel base;
public BakedModelCover(IBakedModel base, @Nullable ItemStack stack) {
this.base = base;
this.stack = stack;
}
@Override
public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) {
if (stack == null) {
return Collections.emptyList();
}
CacheKey key = new CacheKey(base, state, ItemCover.getItem(stack), side);
return CACHE.getUnchecked(key);
}
@Override @Override
public ItemCameraTransforms getItemCameraTransforms() { public ItemCameraTransforms getItemCameraTransforms() {