HangingSignRenderer.java

net.minecraft.client.renderer.blockentity.HangingSignRenderer

信息

  • 全限定名:net.minecraft.client.renderer.blockentity.HangingSignRenderer
  • 类型:public class
  • 包:net.minecraft.client.renderer.blockentity
  • 源码路径:src/main/java/net/minecraft/client/renderer/blockentity/HangingSignRenderer.java
  • 起始行号:L42
  • 继承:AbstractSignRenderer
  • 职责:

    TODO

字段/常量

  • PLANK

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

      TODO

  • V_CHAINS

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

      TODO

  • NORMAL_CHAINS

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

      TODO

  • CHAIN_L_1

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

      TODO

  • CHAIN_L_2

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

      TODO

  • CHAIN_R_1

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

      TODO

  • CHAIN_R_2

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

      TODO

  • BOARD

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

      TODO

  • MODEL_RENDER_SCALE

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

      TODO

  • TEXT_RENDER_SCALE

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

      TODO

  • TEXT_OFFSET

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

      TODO

  • TRANSFORMATIONS

    • 类型: WallAndGroundTransformations<SignRenderState.SignTransformations>
    • 修饰符: public static final
    • 源码定位: L54
    • 说明:

      TODO

  • signModels

    • 类型: Map<WoodType,HangingSignRenderer.Models>
    • 修饰符: private final
    • 源码定位: L57
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.renderer.blockentity.HangingSignRenderer.Models
    • 类型: record
    • 修饰符: private
    • 源码定位: L183
    • 说明:

      TODO

构造器

public HangingSignRenderer(BlockEntityRendererProvider.Context context) @ L59

  • 构造器名:HangingSignRenderer
  • 源码定位:L59
  • 修饰符:public

参数:

  • context: BlockEntityRendererProvider.Context

说明:

TODO

方法

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

public HangingSignRenderState createRenderState() @ L65

  • 方法名:createRenderState
  • 源码定位:L65
  • 返回类型:HangingSignRenderState
  • 修饰符:public

参数:

说明:

TODO

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

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

参数:

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

说明:

TODO

public static Model.Simple createSignModel(EntityModelSet entityModelSet, WoodType woodType, HangingSignBlock.Attachment attachmentType) @ L86

  • 方法名:createSignModel
  • 源码定位:L86
  • 返回类型:Model.Simple
  • 修饰符:public static

参数:

  • entityModelSet: EntityModelSet
  • woodType: WoodType
  • attachmentType: HangingSignBlock.Attachment

说明:

TODO

private static Matrix4f baseTransformation(float angle) @ L90

  • 方法名:baseTransformation
  • 源码定位:L90
  • 返回类型:Matrix4f
  • 修饰符:private static

参数:

  • angle: float

说明:

TODO

private static Transformation bodyTransformation(float angle) @ L94

  • 方法名:bodyTransformation
  • 源码定位:L94
  • 返回类型:Transformation
  • 修饰符:private static

参数:

  • angle: float

说明:

TODO

private static Transformation textTransformation(float angle, boolean isFrontText) @ L98

  • 方法名:textTransformation
  • 源码定位:L98
  • 返回类型:Transformation
  • 修饰符:private static

参数:

  • angle: float
  • isFrontText: boolean

说明:

TODO

private static SignRenderState.SignTransformations createTransformations(float angle) @ L110

  • 方法名:createTransformations
  • 源码定位:L110
  • 返回类型:SignRenderState.SignTransformations
  • 修饰符:private static

参数:

  • angle: float

说明:

TODO

private static SignRenderState.SignTransformations createGroundTransformation(int segment) @ L114

  • 方法名:createGroundTransformation
  • 源码定位:L114
  • 返回类型:SignRenderState.SignTransformations
  • 修饰符:private static

参数:

  • segment: int

说明:

TODO

private static SignRenderState.SignTransformations createWallTransformation(Direction direction) @ L118

  • 方法名:createWallTransformation
  • 源码定位:L118
  • 返回类型:SignRenderState.SignTransformations
  • 修饰符:private static

参数:

  • direction: Direction

说明:

TODO

protected Model.Simple getSignModel(HangingSignRenderState state) @ L122

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

参数:

  • state: HangingSignRenderState

说明:

TODO

protected SpriteId getSignSprite(WoodType type) @ L126

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

参数:

  • type: WoodType

说明:

TODO

public static void submitSpecial(SpriteGetter sprites, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, int overlayCoords, Model.Simple model, SpriteId sprite) @ L131

  • 方法名:submitSpecial
  • 源码定位:L131
  • 返回类型:void
  • 修饰符:public static

参数:

  • sprites: SpriteGetter
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • lightCoords: int
  • overlayCoords: int
  • model: Model.Simple
  • sprite: SpriteId

说明:

TODO

public static LayerDefinition createHangingSignLayer(HangingSignBlock.Attachment type) @ L143

  • 方法名:createHangingSignLayer
  • 源码定位:L143
  • 返回类型:LayerDefinition
  • 修饰符:public static

参数:

  • type: HangingSignBlock.Attachment

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class HangingSignRenderer extends AbstractSignRenderer<HangingSignRenderState> {
    private static final String PLANK = "plank";
    private static final String V_CHAINS = "vChains";
    private static final String NORMAL_CHAINS = "normalChains";
    private static final String CHAIN_L_1 = "chainL1";
    private static final String CHAIN_L_2 = "chainL2";
    private static final String CHAIN_R_1 = "chainR1";
    private static final String CHAIN_R_2 = "chainR2";
    private static final String BOARD = "board";
    private static final float MODEL_RENDER_SCALE = 1.0F;
    private static final float TEXT_RENDER_SCALE = 0.9F;
    private static final Vector3fc TEXT_OFFSET = new Vector3f(0.0F, -0.32F, 0.073F);
    public static final WallAndGroundTransformations<SignRenderState.SignTransformations> TRANSFORMATIONS = new WallAndGroundTransformations<>(
        HangingSignRenderer::createWallTransformation, HangingSignRenderer::createGroundTransformation, 16
    );
    private final Map<WoodType, HangingSignRenderer.Models> signModels;
 
    public HangingSignRenderer(BlockEntityRendererProvider.Context context) {
        super(context);
        this.signModels = WoodType.values()
            .collect(ImmutableMap.toImmutableMap(type -> (WoodType)type, type -> HangingSignRenderer.Models.create(context, type)));
    }
 
    public HangingSignRenderState createRenderState() {
        return new HangingSignRenderState();
    }
 
    public void extractRenderState(
        SignBlockEntity blockEntity,
        HangingSignRenderState state,
        float partialTicks,
        Vec3 cameraPosition,
        ModelFeatureRenderer.@Nullable CrumblingOverlay breakProgress
    ) {
        super.extractRenderState(blockEntity, state, partialTicks, cameraPosition, breakProgress);
        BlockState blockState = blockEntity.getBlockState();
        state.attachmentType = HangingSignBlock.getAttachmentPoint(blockState);
        if (blockState.getBlock() instanceof WallHangingSignBlock) {
            state.transformations = TRANSFORMATIONS.wallTransformation(blockState.getValue(WallHangingSignBlock.FACING));
        } else {
            state.transformations = TRANSFORMATIONS.freeTransformations(blockState.getValue(CeilingHangingSignBlock.ROTATION));
        }
    }
 
    public static Model.Simple createSignModel(EntityModelSet entityModelSet, WoodType woodType, HangingSignBlock.Attachment attachmentType) {
        return new Model.Simple(entityModelSet.bakeLayer(ModelLayers.createHangingSignModelName(woodType, attachmentType)), RenderTypes::entityCutout);
    }
 
    private static Matrix4f baseTransformation(float angle) {
        return new Matrix4f().translation(0.5F, 0.9375F, 0.5F).rotate(Axis.YP.rotationDegrees(-angle)).translate(0.0F, -0.3125F, 0.0F);
    }
 
    private static Transformation bodyTransformation(float angle) {
        return new Transformation(baseTransformation(angle).scale(1.0F, -1.0F, -1.0F));
    }
 
    private static Transformation textTransformation(float angle, boolean isFrontText) {
        Matrix4f result = baseTransformation(angle);
        if (!isFrontText) {
            result.rotate(Axis.YP.rotationDegrees(180.0F));
        }
 
        float s = 0.0140625F;
        result.translate(TEXT_OFFSET);
        result.scale(0.0140625F, -0.0140625F, 0.0140625F);
        return new Transformation(result);
    }
 
    private static SignRenderState.SignTransformations createTransformations(float angle) {
        return new SignRenderState.SignTransformations(bodyTransformation(angle), textTransformation(angle, true), textTransformation(angle, false));
    }
 
    private static SignRenderState.SignTransformations createGroundTransformation(int segment) {
        return createTransformations(RotationSegment.convertToDegrees(segment));
    }
 
    private static SignRenderState.SignTransformations createWallTransformation(Direction direction) {
        return createTransformations(direction.toYRot());
    }
 
    protected Model.Simple getSignModel(HangingSignRenderState state) {
        return this.signModels.get(state.woodType).get(state.attachmentType);
    }
 
    @Override
    protected SpriteId getSignSprite(WoodType type) {
        return Sheets.getHangingSignSprite(type);
    }
 
    public static void submitSpecial(
        SpriteGetter sprites,
        PoseStack poseStack,
        SubmitNodeCollector submitNodeCollector,
        int lightCoords,
        int overlayCoords,
        Model.Simple model,
        SpriteId sprite
    ) {
        submitNodeCollector.submitModel(model, Unit.INSTANCE, poseStack, lightCoords, overlayCoords, -1, sprite, sprites, 0, null);
    }
 
    public static LayerDefinition createHangingSignLayer(HangingSignBlock.Attachment type) {
        MeshDefinition mesh = new MeshDefinition();
        PartDefinition root = mesh.getRoot();
        root.addOrReplaceChild("board", CubeListBuilder.create().texOffs(0, 12).addBox(-7.0F, 0.0F, -1.0F, 14.0F, 10.0F, 2.0F), PartPose.ZERO);
        if (type == HangingSignBlock.Attachment.WALL) {
            root.addOrReplaceChild("plank", CubeListBuilder.create().texOffs(0, 0).addBox(-8.0F, -6.0F, -2.0F, 16.0F, 2.0F, 4.0F), PartPose.ZERO);
        }
 
        if (type == HangingSignBlock.Attachment.WALL || type == HangingSignBlock.Attachment.CEILING) {
            PartDefinition normalChains = root.addOrReplaceChild("normalChains", CubeListBuilder.create(), PartPose.ZERO);
            normalChains.addOrReplaceChild(
                "chainL1",
                CubeListBuilder.create().texOffs(0, 6).addBox(-1.5F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F),
                PartPose.offsetAndRotation(-5.0F, -6.0F, 0.0F, 0.0F, (float) (-Math.PI / 4), 0.0F)
            );
            normalChains.addOrReplaceChild(
                "chainL2",
                CubeListBuilder.create().texOffs(6, 6).addBox(-1.5F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F),
                PartPose.offsetAndRotation(-5.0F, -6.0F, 0.0F, 0.0F, (float) (Math.PI / 4), 0.0F)
            );
            normalChains.addOrReplaceChild(
                "chainR1",
                CubeListBuilder.create().texOffs(0, 6).addBox(-1.5F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F),
                PartPose.offsetAndRotation(5.0F, -6.0F, 0.0F, 0.0F, (float) (-Math.PI / 4), 0.0F)
            );
            normalChains.addOrReplaceChild(
                "chainR2",
                CubeListBuilder.create().texOffs(6, 6).addBox(-1.5F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F),
                PartPose.offsetAndRotation(5.0F, -6.0F, 0.0F, 0.0F, (float) (Math.PI / 4), 0.0F)
            );
        }
 
        if (type == HangingSignBlock.Attachment.CEILING_MIDDLE) {
            root.addOrReplaceChild("vChains", CubeListBuilder.create().texOffs(14, 6).addBox(-6.0F, -6.0F, 0.0F, 12.0F, 6.0F, 0.0F), PartPose.ZERO);
        }
 
        return LayerDefinition.create(mesh, 64, 32);
    }
 
    @OnlyIn(Dist.CLIENT)
    private record Models(Model.Simple ceiling, Model.Simple ceilingMiddle, Model.Simple wall) {
        public static HangingSignRenderer.Models create(BlockEntityRendererProvider.Context context, WoodType type) {
            return new HangingSignRenderer.Models(
                HangingSignRenderer.createSignModel(context.entityModelSet(), type, HangingSignBlock.Attachment.CEILING),
                HangingSignRenderer.createSignModel(context.entityModelSet(), type, HangingSignBlock.Attachment.CEILING_MIDDLE),
                HangingSignRenderer.createSignModel(context.entityModelSet(), type, HangingSignBlock.Attachment.WALL)
            );
        }
 
        public Model.Simple get(HangingSignBlock.Attachment attachmentType) {
            return switch (attachmentType) {
                case CEILING -> this.ceiling;
                case CEILING_MIDDLE -> this.ceilingMiddle;
                case WALL -> this.wall;
            };
        }
    }
}

引用的其他类