2020-07-17 03:55:31 +00:00
|
|
|
package com.thebrokenrail.energonrelics.client.block.entity.render;
|
2020-07-13 20:37:21 +00:00
|
|
|
|
|
|
|
import com.thebrokenrail.energonrelics.EnergonRelics;
|
|
|
|
import com.thebrokenrail.energonrelics.energy.core.EnergyReceiverBlockEntity;
|
|
|
|
import com.thebrokenrail.energonrelics.mixin.RenderPhaseAccessor;
|
|
|
|
import net.minecraft.block.Block;
|
|
|
|
import net.minecraft.block.BlockState;
|
|
|
|
import net.minecraft.block.entity.BlockEntity;
|
|
|
|
import net.minecraft.client.MinecraftClient;
|
|
|
|
import net.minecraft.client.render.RenderLayer;
|
2020-07-31 17:13:55 +00:00
|
|
|
import net.minecraft.client.render.RenderPhase;
|
2020-07-13 20:37:21 +00:00
|
|
|
import net.minecraft.client.render.VertexConsumer;
|
|
|
|
import net.minecraft.client.render.VertexConsumerProvider;
|
|
|
|
import net.minecraft.client.render.VertexFormats;
|
|
|
|
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
|
|
|
|
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
|
|
|
|
import net.minecraft.client.util.math.MatrixStack;
|
|
|
|
import net.minecraft.item.ItemStack;
|
|
|
|
import net.minecraft.util.Hand;
|
2020-07-31 17:13:55 +00:00
|
|
|
import net.minecraft.util.Identifier;
|
2020-07-13 20:37:21 +00:00
|
|
|
import net.minecraft.util.math.Direction;
|
|
|
|
import net.minecraft.util.math.Matrix4f;
|
|
|
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
|
|
|
public class HighlightBlockEntityRenderer extends BlockEntityRenderer<BlockEntity> {
|
|
|
|
public HighlightBlockEntityRenderer(BlockEntityRenderDispatcher dispatcher) {
|
|
|
|
super(dispatcher);
|
|
|
|
}
|
|
|
|
|
2020-07-31 17:13:55 +00:00
|
|
|
private static RenderLayer getLayer(Identifier texture) {
|
2020-07-31 22:53:51 +00:00
|
|
|
return RenderLayer.of(EnergonRelics.NAMESPACE + ":highlight", VertexFormats.POSITION_COLOR, 7, 256, false, true, RenderLayer.MultiPhaseParameters.builder().transparency(RenderPhaseAccessor.getTRANSLUCENT_TRANSPARENCY()).layering(RenderPhaseAccessor.getVIEW_OFFSET_Z_LAYERING()).texture(new RenderPhase.Texture(texture, false, false)).fog(RenderPhaseAccessor.getNO_FOG()).cull(RenderPhaseAccessor.getENABLE_CULLING()).build(false));
|
2020-07-13 20:37:21 +00:00
|
|
|
}
|
|
|
|
|
2020-07-31 17:13:55 +00:00
|
|
|
private static final RenderLayer SELECTED_LAYER = getLayer(new Identifier(EnergonRelics.NAMESPACE, "textures/entity/selected_energy_block.png"));
|
|
|
|
private static final RenderLayer UNSELECTED_LAYER = getLayer(new Identifier(EnergonRelics.NAMESPACE, "textures/entity/unselected_energy_block.png"));
|
2020-07-13 20:37:21 +00:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void render(BlockEntity entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) {
|
|
|
|
matrices.push();
|
|
|
|
if (entity instanceof EnergyReceiverBlockEntity) {
|
|
|
|
MinecraftClient client = MinecraftClient.getInstance();
|
|
|
|
assert client.player != null;
|
|
|
|
ItemStack stack = client.player.getStackInHand(Hand.MAIN_HAND);
|
|
|
|
if (stack.getItem() == EnergonRelics.NETWORK_CHIP_ITEM) {
|
|
|
|
boolean contains = ((EnergyReceiverBlockEntity) entity).contains(EnergonRelics.NETWORK_CHIP_ITEM.getID(stack));
|
|
|
|
Matrix4f matrix4f = matrices.peek().getModel();
|
|
|
|
if (!contains) {
|
2020-07-31 17:13:55 +00:00
|
|
|
renderLayer(entity, matrix4f, vertexConsumers.getBuffer(UNSELECTED_LAYER));
|
2020-07-13 20:37:21 +00:00
|
|
|
} else {
|
2020-07-31 17:13:55 +00:00
|
|
|
renderLayer(entity, matrix4f, vertexConsumers.getBuffer(SELECTED_LAYER));
|
2020-07-13 20:37:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
matrices.pop();
|
|
|
|
}
|
|
|
|
|
2020-07-31 17:13:55 +00:00
|
|
|
private void renderLayer(BlockEntity entity, Matrix4f matrix4f, VertexConsumer vertexConsumer) {
|
|
|
|
renderSide(entity, matrix4f, vertexConsumer, 0f, 1f, 0f, 1f, 1f, 1f, 1f, 1f, Direction.SOUTH);
|
|
|
|
renderSide(entity, matrix4f, vertexConsumer, 0f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, Direction.NORTH);
|
|
|
|
renderSide(entity, matrix4f, vertexConsumer, 1f, 1f, 1f, 0f, 0f, 1f, 1f, 0f, Direction.EAST);
|
|
|
|
renderSide(entity, matrix4f, vertexConsumer, 0f, 0f, 0f, 1f, 0f, 1f, 1f, 0f, Direction.WEST);
|
|
|
|
renderSide(entity, matrix4f, vertexConsumer, 0f, 1f, 0f, 0f, 0f, 0f, 1f, 1f, Direction.DOWN);
|
2020-07-31 22:53:51 +00:00
|
|
|
renderSide(entity, matrix4f, vertexConsumer, 0f, 1f, 1f, 1f, 1f, 1f, 0f, 0f, Direction.UP);
|
2020-07-13 20:37:21 +00:00
|
|
|
}
|
|
|
|
|
2020-07-31 22:53:51 +00:00
|
|
|
protected boolean shouldDrawSide(BlockEntity entity, Direction side) {
|
2020-07-13 20:37:21 +00:00
|
|
|
BlockState state = entity.getCachedState();
|
|
|
|
return Block.shouldDrawSide(state, Objects.requireNonNull(entity.getWorld()), entity.getPos(), side);
|
|
|
|
}
|
|
|
|
|
2020-07-31 17:13:55 +00:00
|
|
|
private void renderSide(BlockEntity entity, Matrix4f matrix4f, VertexConsumer vertexConsumer, float f, float g, float h, float i, float j, float k, float l, float m, Direction side) {
|
2020-07-13 20:37:21 +00:00
|
|
|
if (shouldDrawSide(entity, side)) {
|
2020-07-31 17:13:55 +00:00
|
|
|
vertexConsumer.vertex(matrix4f, f, h, j).color(1f, 1f, 1f, 1f).next();
|
|
|
|
vertexConsumer.vertex(matrix4f, g, h, k).color(1f, 1f, 1f, 1f).next();
|
|
|
|
vertexConsumer.vertex(matrix4f, g, i, l).color(1f, 1f, 1f, 1f).next();
|
|
|
|
vertexConsumer.vertex(matrix4f, f, i, m).color(1f, 1f, 1f, 1f).next();
|
2020-07-13 20:37:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|