Files
Applied-Energistics-2/src/main/java/appeng/client/render/model/MemoryCardBakedModel.java
T
2020-07-28 10:29:57 +02:00

189 lines
6.0 KiB
Java

package appeng.client.render.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import javax.annotation.Nullable;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.collect.ImmutableList;
import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.model.ItemCameraTransforms;
import net.minecraft.client.renderer.model.ItemOverrideList;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraftforge.client.model.data.EmptyModelData;
import appeng.api.implementations.items.IMemoryCard;
import appeng.api.util.AEColor;
import appeng.client.render.cablebus.CubeBuilder;
import appeng.core.AELog;
class MemoryCardBakedModel implements IBakedModel {
private static final AEColor[] DEFAULT_COLOR_CODE = new AEColor[] { AEColor.TRANSPARENT, AEColor.TRANSPARENT,
AEColor.TRANSPARENT, AEColor.TRANSPARENT, AEColor.TRANSPARENT, AEColor.TRANSPARENT, AEColor.TRANSPARENT,
AEColor.TRANSPARENT, };
private final IBakedModel baseModel;
private final TextureAtlasSprite texture;
private final AEColor[] colorCode;
private final Cache<CacheKey, MemoryCardBakedModel> modelCache;
private final ImmutableList<BakedQuad> generalQuads;
MemoryCardBakedModel(IBakedModel baseModel, TextureAtlasSprite texture) {
this(baseModel, texture, DEFAULT_COLOR_CODE, createCache());
}
private MemoryCardBakedModel(IBakedModel baseModel, TextureAtlasSprite texture, AEColor[] hash,
Cache<CacheKey, MemoryCardBakedModel> modelCache) {
this.baseModel = baseModel;
this.texture = texture;
this.colorCode = hash;
this.generalQuads = ImmutableList.copyOf(this.buildGeneralQuads());
this.modelCache = modelCache;
}
private static Cache<CacheKey, MemoryCardBakedModel> createCache() {
return CacheBuilder.newBuilder().maximumSize(100).build();
}
@Override
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand) {
List<BakedQuad> quads = this.baseModel.getQuads(state, side, rand, EmptyModelData.INSTANCE);
if (side != null) {
return quads;
}
List<BakedQuad> result = new ArrayList<>(quads.size() + this.generalQuads.size());
result.addAll(quads);
result.addAll(this.generalQuads);
return result;
}
private List<BakedQuad> buildGeneralQuads() {
CubeBuilder builder = new CubeBuilder();
builder.setTexture(this.texture);
for (int x = 0; x < 4; x++) {
for (int y = 0; y < 2; y++) {
final AEColor color = this.colorCode[x + y * 4];
builder.setColorRGB(color.mediumVariant);
builder.addCube(7 + x, 8 + (1 - y), 7.5f, 7 + x + 1, 8 + (1 - y) + 1, 8.5f);
}
}
return builder.getOutput();
}
@Override
public boolean isAmbientOcclusion() {
return this.baseModel.isAmbientOcclusion();
}
@Override
public boolean isGui3d() {
return this.baseModel.isGui3d();
}
@Override
public boolean func_230044_c_() {
return false;// TODO
}
@Override
public boolean isBuiltInRenderer() {
return this.baseModel.isBuiltInRenderer();
}
@Override
public TextureAtlasSprite getParticleTexture() {
return this.baseModel.getParticleTexture();
}
@Override
public ItemCameraTransforms getItemCameraTransforms() {
return this.baseModel.getItemCameraTransforms();
}
@Override
public ItemOverrideList getOverrides() {
return new ItemOverrideList() {
@Override
public IBakedModel func_239290_a_(IBakedModel originalModel, ItemStack stack, ClientWorld world,
LivingEntity entity) {
try {
if (stack.getItem() instanceof IMemoryCard) {
final IMemoryCard memoryCard = (IMemoryCard) stack.getItem();
final AEColor[] colors = memoryCard.getColorCode(stack);
return MemoryCardBakedModel.this.modelCache.get(new CacheKey(colors),
() -> new MemoryCardBakedModel(MemoryCardBakedModel.this.baseModel,
MemoryCardBakedModel.this.texture, colors,
MemoryCardBakedModel.this.modelCache));
}
} catch (ExecutionException e) {
AELog.error(e);
}
return MemoryCardBakedModel.this;
}
};
}
@Override
public IBakedModel handlePerspective(ItemCameraTransforms.TransformType cameraTransformType, MatrixStack mat) {
baseModel.handlePerspective(cameraTransformType, mat);
return this;
}
private static class CacheKey {
private final AEColor[] key;
CacheKey(AEColor[] key) {
this.key = key;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(this.key);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (this.getClass() != obj.getClass()) {
return false;
}
CacheKey other = (CacheKey) obj;
return Arrays.equals(this.key, other.key);
}
}
}