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