/* * Decompiled with CFR 0.152. * * Could not load the following classes: * org.joml.Quaternionfc * org.jspecify.annotations.Nullable */ package net.minecraft.client.renderer.blockentity; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.model.Model; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.blockentity.state.SignRenderState; import net.minecraft.client.renderer.feature.ModelFeatureRenderer; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.state.CameraRenderState; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.resources.model.Material; import net.minecraft.client.resources.model.MaterialSet; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.FormattedText; import net.minecraft.util.ARGB; import net.minecraft.util.FormattedCharSequence; import net.minecraft.util.Mth; import net.minecraft.util.Unit; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.block.SignBlock; import net.minecraft.world.level.block.entity.SignBlockEntity; import net.minecraft.world.level.block.entity.SignText; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.WoodType; import net.minecraft.world.phys.Vec3; import org.joml.Quaternionfc; import org.jspecify.annotations.Nullable; public abstract class AbstractSignRenderer implements BlockEntityRenderer { private static final int BLACK_TEXT_OUTLINE_COLOR = -988212; private static final int OUTLINE_RENDER_DISTANCE = Mth.square(16); private final Font font; private final MaterialSet materials; public AbstractSignRenderer(BlockEntityRendererProvider.Context context) { this.font = context.font(); this.materials = context.materials(); } protected abstract Model.Simple getSignModel(BlockState var1, WoodType var2); protected abstract Material getSignMaterial(WoodType var1); protected abstract float getSignModelRenderScale(); protected abstract float getSignTextRenderScale(); protected abstract Vec3 getTextOffset(); protected abstract void translateSign(PoseStack var1, float var2, BlockState var3); @Override public void submit(SignRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) { BlockState blockState = state.blockState; SignBlock signBlock = (SignBlock)blockState.getBlock(); Model.Simple signModel = this.getSignModel(blockState, signBlock.type()); this.submitSignWithText(state, poseStack, blockState, signBlock, signBlock.type(), signModel, state.breakProgress, submitNodeCollector); } private void submitSignWithText(SignRenderState state, PoseStack poseStack, BlockState blockState, SignBlock signBlock, WoodType type, Model.Simple signModel, @Nullable ModelFeatureRenderer.CrumblingOverlay breakProgress, SubmitNodeCollector submitNodeCollector) { poseStack.pushPose(); this.translateSign(poseStack, -signBlock.getYRotationDegrees(blockState), blockState); this.submitSign(poseStack, state.lightCoords, type, signModel, breakProgress, submitNodeCollector); this.submitSignText(state, poseStack, submitNodeCollector, true); this.submitSignText(state, poseStack, submitNodeCollector, false); poseStack.popPose(); } protected void submitSign(PoseStack poseStack, int lightCoords, WoodType type, Model.Simple signModel, @Nullable ModelFeatureRenderer.CrumblingOverlay breakProgress, SubmitNodeCollector submitNodeCollector) { poseStack.pushPose(); float scale = this.getSignModelRenderScale(); poseStack.scale(scale, -scale, -scale); Material material = this.getSignMaterial(type); RenderType renderType = material.renderType(signModel::renderType); submitNodeCollector.submitModel(signModel, Unit.INSTANCE, poseStack, renderType, lightCoords, OverlayTexture.NO_OVERLAY, -1, this.materials.get(material), 0, breakProgress); poseStack.popPose(); } private void submitSignText(SignRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, boolean isFrontText) { int lightVal; boolean drawOutline; int textColor; SignText signText; SignText signText2 = signText = isFrontText ? state.frontText : state.backText; if (signText == null) { return; } poseStack.pushPose(); this.translateSignText(poseStack, isFrontText, this.getTextOffset()); int darkColor = AbstractSignRenderer.getDarkColor(signText); int signMidpoint = 4 * state.textLineHeight / 2; FormattedCharSequence[] formattedLines = signText.getRenderMessages(state.isTextFilteringEnabled, input -> { List components = this.font.split((FormattedText)input, state.maxTextLineWidth); return components.isEmpty() ? FormattedCharSequence.EMPTY : components.get(0); }); if (signText.hasGlowingText()) { textColor = signText.getColor().getTextColor(); drawOutline = textColor == DyeColor.BLACK.getTextColor() || state.drawOutline; lightVal = 0xF000F0; } else { textColor = darkColor; drawOutline = false; lightVal = state.lightCoords; } for (int i = 0; i < 4; ++i) { FormattedCharSequence actualLine = formattedLines[i]; float x1 = -this.font.width(actualLine) / 2; submitNodeCollector.submitText(poseStack, x1, i * state.textLineHeight - signMidpoint, actualLine, false, Font.DisplayMode.POLYGON_OFFSET, lightVal, textColor, 0, drawOutline ? darkColor : 0); } poseStack.popPose(); } private void translateSignText(PoseStack poseStack, boolean isFrontText, Vec3 textOffset) { if (!isFrontText) { poseStack.mulPose((Quaternionfc)Axis.YP.rotationDegrees(180.0f)); } float s = 0.015625f * this.getSignTextRenderScale(); poseStack.translate(textOffset); poseStack.scale(s, -s, s); } private static boolean isOutlineVisible(BlockPos pos) { Minecraft minecraft = Minecraft.getInstance(); LocalPlayer player = minecraft.player; if (player != null && minecraft.options.getCameraType().isFirstPerson() && player.isScoping()) { return true; } Entity camera = minecraft.getCameraEntity(); return camera != null && camera.distanceToSqr(Vec3.atCenterOf(pos)) < (double)OUTLINE_RENDER_DISTANCE; } public static int getDarkColor(SignText signText) { int color = signText.getColor().getTextColor(); if (color == DyeColor.BLACK.getTextColor() && signText.hasGlowingText()) { return -988212; } return ARGB.scaleRGB(color, 0.4f); } @Override public SignRenderState createRenderState() { return new SignRenderState(); } @Override public void extractRenderState(SignBlockEntity blockEntity, SignRenderState state, float partialTicks, Vec3 cameraPosition, @Nullable ModelFeatureRenderer.CrumblingOverlay breakProgress) { BlockEntityRenderer.super.extractRenderState(blockEntity, state, partialTicks, cameraPosition, breakProgress); state.maxTextLineWidth = blockEntity.getMaxTextLineWidth(); state.textLineHeight = blockEntity.getTextLineHeight(); state.frontText = blockEntity.getFrontText(); state.backText = blockEntity.getBackText(); state.isTextFilteringEnabled = Minecraft.getInstance().isTextFilteringEnabled(); state.drawOutline = AbstractSignRenderer.isOutlineVisible(blockEntity.getBlockPos()); } }