AbstractSignRenderer.java

net.minecraft.client.renderer.blockentity.AbstractSignRenderer

信息

  • 全限定名:net.minecraft.client.renderer.blockentity.AbstractSignRenderer
  • 类型:public abstract class
  • 包:net.minecraft.client.renderer.blockentity
  • 源码路径:src/main/java/net/minecraft/client/renderer/blockentity/AbstractSignRenderer.java
  • 起始行号:L33
  • 实现:BlockEntityRenderer<SignBlockEntity,S>
  • 职责:

    TODO

字段/常量

  • BLACK_TEXT_OUTLINE_COLOR

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L34
    • 说明:

      TODO

  • OUTLINE_RENDER_DISTANCE

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L35
    • 说明:

      TODO

  • font

    • 类型: Font
    • 修饰符: private final
    • 源码定位: L36
    • 说明:

      TODO

  • sprites

    • 类型: SpriteGetter
    • 修饰符: private final
    • 源码定位: L37
    • 说明:

      TODO

内部类/嵌套类型

构造器

public AbstractSignRenderer(BlockEntityRendererProvider.Context context) @ L39

  • 构造器名:AbstractSignRenderer
  • 源码定位:L39
  • 修饰符:public

参数:

  • context: BlockEntityRendererProvider.Context

说明:

TODO

方法

下面的方法块按源码顺序生成。

protected abstract Model.Simple getSignModel(S state) @ L44

  • 方法名:getSignModel
  • 源码定位:L44
  • 返回类型:Model.Simple
  • 修饰符:protected abstract

参数:

  • state: S

说明:

TODO

protected abstract SpriteId getSignSprite(WoodType type) @ L46

  • 方法名:getSignSprite
  • 源码定位:L46
  • 返回类型:SpriteId
  • 修饰符:protected abstract

参数:

  • type: WoodType

说明:

TODO

public void submit(S state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) @ L48

  • 方法名:submit
  • 源码定位:L48
  • 返回类型:void
  • 修饰符:public

参数:

  • state: S
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • camera: CameraRenderState

说明:

TODO

private void submitSignWithText(S state, PoseStack poseStack, ModelFeatureRenderer.CrumblingOverlay breakProgress, SubmitNodeCollector submitNodeCollector) @ L52

  • 方法名:submitSignWithText
  • 源码定位:L52
  • 返回类型:void
  • 修饰符:private

参数:

  • state: S
  • poseStack: PoseStack
  • breakProgress: ModelFeatureRenderer.CrumblingOverlay
  • submitNodeCollector: SubmitNodeCollector

说明:

TODO

protected void submitSign(PoseStack poseStack, int lightCoords, WoodType type, Model.Simple signModel, ModelFeatureRenderer.CrumblingOverlay breakProgress, SubmitNodeCollector submitNodeCollector) @ L75

  • 方法名:submitSign
  • 源码定位:L75
  • 返回类型:void
  • 修饰符:protected

参数:

  • poseStack: PoseStack
  • lightCoords: int
  • type: WoodType
  • signModel: Model.Simple
  • breakProgress: ModelFeatureRenderer.CrumblingOverlay
  • submitNodeCollector: SubmitNodeCollector

说明:

TODO

private void submitSignText(S state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, SignText signText) @ L87

  • 方法名:submitSignText
  • 源码定位:L87
  • 返回类型:void
  • 修饰符:private

参数:

  • state: S
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • signText: SignText

说明:

TODO

private static boolean isOutlineVisible(BlockPos pos) @ L125

  • 方法名:isOutlineVisible
  • 源码定位:L125
  • 返回类型:boolean
  • 修饰符:private static

参数:

  • pos: BlockPos

说明:

TODO

public static int getDarkColor(SignText signText) @ L136

  • 方法名:getDarkColor
  • 源码定位:L136
  • 返回类型:int
  • 修饰符:public static

参数:

  • signText: SignText

说明:

TODO

public void extractRenderState(SignBlockEntity blockEntity, S state, float partialTicks, Vec3 cameraPosition, ModelFeatureRenderer.CrumblingOverlay breakProgress) @ L141

  • 方法名:extractRenderState
  • 源码定位:L141
  • 返回类型:void
  • 修饰符:public

参数:

  • blockEntity: SignBlockEntity
  • state: S
  • partialTicks: float
  • cameraPosition: Vec3
  • breakProgress: ModelFeatureRenderer.CrumblingOverlay

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public abstract class AbstractSignRenderer<S extends SignRenderState> implements BlockEntityRenderer<SignBlockEntity, S> {
    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 SpriteGetter sprites;
 
    public AbstractSignRenderer(BlockEntityRendererProvider.Context context) {
        this.font = context.font();
        this.sprites = context.sprites();
    }
 
    protected abstract Model.Simple getSignModel(S state);
 
    protected abstract SpriteId getSignSprite(WoodType type);
 
    public void submit(S state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) {
        this.submitSignWithText(state, poseStack, state.breakProgress, submitNodeCollector);
    }
 
    private void submitSignWithText(
        S state, PoseStack poseStack, ModelFeatureRenderer.@Nullable CrumblingOverlay breakProgress, SubmitNodeCollector submitNodeCollector
    ) {
        Model.Simple bodyModel = this.getSignModel(state);
        poseStack.pushPose();
        poseStack.mulPose(state.transformations.body());
        this.submitSign(poseStack, state.lightCoords, state.woodType, bodyModel, breakProgress, submitNodeCollector);
        poseStack.popPose();
        if (state.frontText != null) {
            poseStack.pushPose();
            poseStack.mulPose(state.transformations.frontText());
            this.submitSignText(state, poseStack, submitNodeCollector, state.frontText);
            poseStack.popPose();
        }
 
        if (state.backText != null) {
            poseStack.pushPose();
            poseStack.mulPose(state.transformations.backText());
            this.submitSignText(state, poseStack, submitNodeCollector, state.backText);
            poseStack.popPose();
        }
    }
 
    protected void submitSign(
        PoseStack poseStack,
        int lightCoords,
        WoodType type,
        Model.Simple signModel,
        ModelFeatureRenderer.@Nullable CrumblingOverlay breakProgress,
        SubmitNodeCollector submitNodeCollector
    ) {
        SpriteId sprite = this.getSignSprite(type);
        submitNodeCollector.submitModel(signModel, Unit.INSTANCE, poseStack, lightCoords, OverlayTexture.NO_OVERLAY, -1, sprite, this.sprites, 0, breakProgress);
    }
 
    private void submitSignText(S state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, SignText signText) {
        int darkColor = getDarkColor(signText);
        int signMidpoint = 4 * state.textLineHeight / 2;
        FormattedCharSequence[] formattedLines = signText.getRenderMessages(state.isTextFilteringEnabled, input -> {
            List<FormattedCharSequence> components = this.font.split(input, state.maxTextLineWidth);
            return components.isEmpty() ? FormattedCharSequence.EMPTY : components.get(0);
        });
        int textColor;
        boolean drawOutline;
        int lightVal;
        if (signText.hasGlowingText()) {
            textColor = signText.getColor().getTextColor();
            drawOutline = textColor == DyeColor.BLACK.getTextColor() || state.drawOutline;
            lightVal = 15728880;
        } 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
            );
        }
    }
 
    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;
        } else {
            Entity camera = minecraft.getCameraEntity();
            return camera != null && camera.distanceToSqr(Vec3.atCenterOf(pos)) < OUTLINE_RENDER_DISTANCE;
        }
    }
 
    public static int getDarkColor(SignText signText) {
        int color = signText.getColor().getTextColor();
        return color == DyeColor.BLACK.getTextColor() && signText.hasGlowingText() ? -988212 : ARGB.scaleRGB(color, 0.4F);
    }
 
    public void extractRenderState(
        SignBlockEntity blockEntity, S state, float partialTicks, Vec3 cameraPosition, ModelFeatureRenderer.@Nullable 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 = isOutlineVisible(blockEntity.getBlockPos());
        state.woodType = SignBlock.getWoodType(blockEntity.getBlockState().getBlock());
    }
}

引用的其他类