StandingSignRenderer.java

net.minecraft.client.renderer.blockentity.StandingSignRenderer

信息

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

    TODO

字段/常量

  • RENDER_SCALE

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

      TODO

  • TEXT_OFFSET

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

      TODO

  • TRANSFORMATIONS

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

      TODO

  • signModels

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

      TODO

内部类/嵌套类型

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

      TODO

构造器

public StandingSignRenderer(BlockEntityRendererProvider.Context context) @ L51

  • 构造器名:StandingSignRenderer
  • 源码定位:L51
  • 修饰符:public

参数:

  • context: BlockEntityRendererProvider.Context

说明:

TODO

方法

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

public StandingSignRenderState createRenderState() @ L57

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

参数:

说明:

TODO

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

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

参数:

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

说明:

TODO

protected Model.Simple getSignModel(StandingSignRenderState state) @ L78

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

参数:

  • state: StandingSignRenderState

说明:

TODO

protected SpriteId getSignSprite(WoodType type) @ L82

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

参数:

  • type: WoodType

说明:

TODO

private static Matrix4f baseTransformation(float angle, PlainSignBlock.Attachment attachmentType) @ L87

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

参数:

  • angle: float
  • attachmentType: PlainSignBlock.Attachment

说明:

TODO

private static Transformation bodyTransformation(PlainSignBlock.Attachment attachmentType, float angle) @ L96

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

参数:

  • attachmentType: PlainSignBlock.Attachment
  • angle: float

说明:

TODO

private static Transformation textTransformation(PlainSignBlock.Attachment attachmentType, float angle, boolean isFrontText) @ L100

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

参数:

  • attachmentType: PlainSignBlock.Attachment
  • angle: float
  • isFrontText: boolean

说明:

TODO

private static SignRenderState.SignTransformations createTransformations(PlainSignBlock.Attachment attachmentType, float angle) @ L110

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

参数:

  • attachmentType: PlainSignBlock.Attachment
  • angle: float

说明:

TODO

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

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

参数:

  • segment: int

说明:

TODO

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

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

参数:

  • direction: Direction

说明:

TODO

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

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

参数:

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

说明:

TODO

public static Model.Simple createSignModel(EntityModelSet entityModelSet, WoodType woodType, PlainSignBlock.Attachment attachment) @ L136

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

参数:

  • entityModelSet: EntityModelSet
  • woodType: WoodType
  • attachment: PlainSignBlock.Attachment

说明:

TODO

public static LayerDefinition createSignLayer(boolean standing) @ L144

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

参数:

  • standing: boolean

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class StandingSignRenderer extends AbstractSignRenderer<StandingSignRenderState> {
    private static final float RENDER_SCALE = 0.6666667F;
    private static final Vector3fc TEXT_OFFSET = new Vector3f(0.0F, 0.33333334F, 0.046666667F);
    public static final WallAndGroundTransformations<SignRenderState.SignTransformations> TRANSFORMATIONS = new WallAndGroundTransformations<>(
        StandingSignRenderer::createWallTransformation, StandingSignRenderer::createGroundTransformation, 16
    );
    private final Map<WoodType, StandingSignRenderer.Models> signModels;
 
    public StandingSignRenderer(BlockEntityRendererProvider.Context context) {
        super(context);
        this.signModels = WoodType.values()
            .collect(ImmutableMap.toImmutableMap(type -> (WoodType)type, type -> StandingSignRenderer.Models.create(context, type)));
    }
 
    public StandingSignRenderState createRenderState() {
        return new StandingSignRenderState();
    }
 
    public void extractRenderState(
        SignBlockEntity blockEntity,
        StandingSignRenderState state,
        float partialTicks,
        Vec3 cameraPosition,
        ModelFeatureRenderer.@Nullable CrumblingOverlay breakProgress
    ) {
        super.extractRenderState(blockEntity, state, partialTicks, cameraPosition, breakProgress);
        BlockState blockState = blockEntity.getBlockState();
        state.attachmentType = PlainSignBlock.getAttachmentPoint(blockState);
        if (blockState.getBlock() instanceof WallSignBlock) {
            state.transformations = TRANSFORMATIONS.wallTransformation(blockState.getValue(WallSignBlock.FACING));
        } else {
            state.transformations = TRANSFORMATIONS.freeTransformations(blockState.getValue(StandingSignBlock.ROTATION));
        }
    }
 
    protected Model.Simple getSignModel(StandingSignRenderState state) {
        return this.signModels.get(state.woodType).get(state.attachmentType);
    }
 
    @Override
    protected SpriteId getSignSprite(WoodType type) {
        return Sheets.getSignSprite(type);
    }
 
    private static Matrix4f baseTransformation(float angle, PlainSignBlock.Attachment attachmentType) {
        Matrix4f result = new Matrix4f().translate(0.5F, 0.5F, 0.5F).rotate(Axis.YP.rotationDegrees(-angle));
        if (attachmentType == PlainSignBlock.Attachment.WALL) {
            result.translate(0.0F, -0.3125F, -0.4375F);
        }
 
        return result;
    }
 
    private static Transformation bodyTransformation(PlainSignBlock.Attachment attachmentType, float angle) {
        return new Transformation(baseTransformation(angle, attachmentType).scale(0.6666667F, -0.6666667F, -0.6666667F));
    }
 
    private static Transformation textTransformation(PlainSignBlock.Attachment attachmentType, float angle, boolean isFrontText) {
        Matrix4f result = baseTransformation(angle, attachmentType);
        if (!isFrontText) {
            result.rotate(Axis.YP.rotationDegrees(180.0F));
        }
 
        float s = 0.010416667F;
        return new Transformation(result.translate(TEXT_OFFSET).scale(0.010416667F, -0.010416667F, 0.010416667F));
    }
 
    private static SignRenderState.SignTransformations createTransformations(PlainSignBlock.Attachment attachmentType, float angle) {
        return new SignRenderState.SignTransformations(
            bodyTransformation(attachmentType, angle), textTransformation(attachmentType, angle, true), textTransformation(attachmentType, angle, false)
        );
    }
 
    private static SignRenderState.SignTransformations createGroundTransformation(int segment) {
        return createTransformations(PlainSignBlock.Attachment.GROUND, RotationSegment.convertToDegrees(segment));
    }
 
    private static SignRenderState.SignTransformations createWallTransformation(Direction direction) {
        return createTransformations(PlainSignBlock.Attachment.WALL, direction.toYRot());
    }
 
    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 Model.Simple createSignModel(EntityModelSet entityModelSet, WoodType woodType, PlainSignBlock.Attachment attachment) {
        ModelLayerLocation layer = switch (attachment) {
            case GROUND -> ModelLayers.createStandingSignModelName(woodType);
            case WALL -> ModelLayers.createWallSignModelName(woodType);
        };
        return new Model.Simple(entityModelSet.bakeLayer(layer), RenderTypes::entityCutout);
    }
 
    public static LayerDefinition createSignLayer(boolean standing) {
        MeshDefinition mesh = new MeshDefinition();
        PartDefinition root = mesh.getRoot();
        root.addOrReplaceChild("sign", CubeListBuilder.create().texOffs(0, 0).addBox(-12.0F, -14.0F, -1.0F, 24.0F, 12.0F, 2.0F), PartPose.ZERO);
        if (standing) {
            root.addOrReplaceChild("stick", CubeListBuilder.create().texOffs(0, 14).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 14.0F, 2.0F), PartPose.ZERO);
        }
 
        return LayerDefinition.create(mesh, 64, 32);
    }
 
    @OnlyIn(Dist.CLIENT)
    private record Models(Model.Simple standing, Model.Simple wall) {
        public static StandingSignRenderer.Models create(BlockEntityRendererProvider.Context context, WoodType type) {
            return new StandingSignRenderer.Models(
                StandingSignRenderer.createSignModel(context.entityModelSet(), type, PlainSignBlock.Attachment.GROUND),
                StandingSignRenderer.createSignModel(context.entityModelSet(), type, PlainSignBlock.Attachment.WALL)
            );
        }
 
        public Model.Simple get(PlainSignBlock.Attachment attachmentType) {
            return switch (attachmentType) {
                case GROUND -> this.standing;
                case WALL -> this.wall;
            };
        }
    }
}

引用的其他类