Increase rendering performance of cover items.
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user