BedRenderer.java

net.minecraft.client.renderer.blockentity.BedRenderer

信息

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

    TODO

字段/常量

  • TRANSFORMATIONS

    • 类型: Map<Direction,Transformation>
    • 修饰符: private static final
    • 源码定位: L45
    • 说明:

      TODO

  • VISIBLE_LEG_FACES

    • 类型: Set<Direction>
    • 修饰符: private static final
    • 源码定位: L46
    • 说明:

      TODO

  • sprites

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

      TODO

  • headModel

    • 类型: Model.Simple
    • 修饰符: private final
    • 源码定位: L48
    • 说明:

      TODO

  • footModel

    • 类型: Model.Simple
    • 修饰符: private final
    • 源码定位: L49
    • 说明:

      TODO

内部类/嵌套类型

构造器

public BedRenderer(BlockEntityRendererProvider.Context context) @ L51

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

参数:

  • context: BlockEntityRendererProvider.Context

说明:

TODO

public BedRenderer(SpecialModelRenderer.BakingContext context) @ L55

  • 构造器名:BedRenderer
  • 源码定位:L55
  • 修饰符:public

参数:

  • context: SpecialModelRenderer.BakingContext

说明:

TODO

public BedRenderer(SpriteGetter sprites, EntityModelSet entityModelSet) @ L59

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

参数:

  • sprites: SpriteGetter
  • entityModelSet: EntityModelSet

说明:

TODO

方法

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

public static LayerDefinition createHeadLayer() @ L65

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

参数:

说明:

TODO

public static LayerDefinition createFootLayer() @ L83

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

参数:

说明:

TODO

public BedRenderState createRenderState() @ L101

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

参数:

说明:

TODO

public void extractRenderState(BedBlockEntity blockEntity, BedRenderState state, float partialTicks, Vec3 cameraPosition, ModelFeatureRenderer.CrumblingOverlay breakProgress) @ L105

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

参数:

  • blockEntity: BedBlockEntity
  • state: BedRenderState
  • partialTicks: float
  • cameraPosition: Vec3
  • breakProgress: ModelFeatureRenderer.CrumblingOverlay

说明:

TODO

public void submit(BedRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) @ L131

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

参数:

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

说明:

TODO

public void submitPiece(BedPart part, SpriteId sprite, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, int overlayCoords, ModelFeatureRenderer.CrumblingOverlay breakProgress, int outlineColor) @ L139

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

参数:

  • part: BedPart
  • sprite: SpriteId
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • lightCoords: int
  • overlayCoords: int
  • breakProgress: ModelFeatureRenderer.CrumblingOverlay
  • outlineColor: int

说明:

TODO

private Model.Simple getPieceModel(BedPart part) @ L153

  • 方法名:getPieceModel
  • 源码定位:L153
  • 返回类型:Model.Simple
  • 修饰符:private

参数:

  • part: BedPart

说明:

TODO

private static Transformation createModelTransform(Direction direction) @ L160

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

参数:

  • direction: Direction

说明:

TODO

public static Transformation modelTransform(Direction direction) @ L169

  • 方法名:modelTransform
  • 源码定位:L169
  • 返回类型:Transformation
  • 修饰符:public static

参数:

  • direction: Direction

说明:

TODO

public void getExtents(BedPart part, Consumer<Vector3fc> output) @ L173

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

参数:

  • part: BedPart
  • output: Consumer

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class BedRenderer implements BlockEntityRenderer<BedBlockEntity, BedRenderState> {
    private static final Map<Direction, Transformation> TRANSFORMATIONS = Util.makeEnumMap(Direction.class, BedRenderer::createModelTransform);
    private static final Set<Direction> VISIBLE_LEG_FACES = Util.allOfEnumExcept(Direction.DOWN);
    private final SpriteGetter sprites;
    private final Model.Simple headModel;
    private final Model.Simple footModel;
 
    public BedRenderer(BlockEntityRendererProvider.Context context) {
        this(context.sprites(), context.entityModelSet());
    }
 
    public BedRenderer(SpecialModelRenderer.BakingContext context) {
        this(context.sprites(), context.entityModelSet());
    }
 
    public BedRenderer(SpriteGetter sprites, EntityModelSet entityModelSet) {
        this.sprites = sprites;
        this.headModel = new Model.Simple(entityModelSet.bakeLayer(ModelLayers.BED_HEAD), RenderTypes::entitySolid);
        this.footModel = new Model.Simple(entityModelSet.bakeLayer(ModelLayers.BED_FOOT), RenderTypes::entitySolid);
    }
 
    public static LayerDefinition createHeadLayer() {
        MeshDefinition mesh = new MeshDefinition();
        PartDefinition root = mesh.getRoot();
        Set<Direction> visibleBodyFaces = Util.allOfEnumExcept(Direction.UP);
        root.addOrReplaceChild("main", CubeListBuilder.create().texOffs(0, 0).addBox(0.0F, 0.0F, 0.0F, 16.0F, 16.0F, 6.0F, visibleBodyFaces), PartPose.ZERO);
        root.addOrReplaceChild(
            "left_leg",
            CubeListBuilder.create().texOffs(50, 6).addBox(0.0F, 6.0F, 0.0F, 3.0F, 3.0F, 3.0F, VISIBLE_LEG_FACES),
            PartPose.rotation((float) (Math.PI / 2), 0.0F, (float) (Math.PI / 2))
        );
        root.addOrReplaceChild(
            "right_leg",
            CubeListBuilder.create().texOffs(50, 18).addBox(-16.0F, 6.0F, 0.0F, 3.0F, 3.0F, 3.0F, VISIBLE_LEG_FACES),
            PartPose.rotation((float) (Math.PI / 2), 0.0F, (float) Math.PI)
        );
        return LayerDefinition.create(mesh, 64, 64);
    }
 
    public static LayerDefinition createFootLayer() {
        MeshDefinition mesh = new MeshDefinition();
        PartDefinition root = mesh.getRoot();
        Set<Direction> visibleBodyFaces = Util.allOfEnumExcept(Direction.DOWN);
        root.addOrReplaceChild("main", CubeListBuilder.create().texOffs(0, 22).addBox(0.0F, 0.0F, 0.0F, 16.0F, 16.0F, 6.0F, visibleBodyFaces), PartPose.ZERO);
        root.addOrReplaceChild(
            "left_leg",
            CubeListBuilder.create().texOffs(50, 0).addBox(0.0F, 6.0F, -16.0F, 3.0F, 3.0F, 3.0F, VISIBLE_LEG_FACES),
            PartPose.rotation((float) (Math.PI / 2), 0.0F, 0.0F)
        );
        root.addOrReplaceChild(
            "right_leg",
            CubeListBuilder.create().texOffs(50, 12).addBox(-16.0F, 6.0F, -16.0F, 3.0F, 3.0F, 3.0F, VISIBLE_LEG_FACES),
            PartPose.rotation((float) (Math.PI / 2), 0.0F, (float) (Math.PI * 3.0 / 2.0))
        );
        return LayerDefinition.create(mesh, 64, 64);
    }
 
    public BedRenderState createRenderState() {
        return new BedRenderState();
    }
 
    public void extractRenderState(
        BedBlockEntity blockEntity,
        BedRenderState state,
        float partialTicks,
        Vec3 cameraPosition,
        ModelFeatureRenderer.@Nullable CrumblingOverlay breakProgress
    ) {
        BlockEntityRenderer.super.extractRenderState(blockEntity, state, partialTicks, cameraPosition, breakProgress);
        state.color = blockEntity.getColor();
        state.facing = blockEntity.getBlockState().getValue(BedBlock.FACING);
        state.part = blockEntity.getBlockState().getValue(BedBlock.PART);
        if (blockEntity.getLevel() != null) {
            DoubleBlockCombiner.NeighborCombineResult<? extends BedBlockEntity> combineResult = DoubleBlockCombiner.combineWithNeigbour(
                BlockEntityType.BED,
                BedBlock::getBlockType,
                BedBlock::getConnectedDirection,
                ChestBlock.FACING,
                blockEntity.getBlockState(),
                blockEntity.getLevel(),
                blockEntity.getBlockPos(),
                (levelAccessor, blockPos) -> false
            );
            state.lightCoords = combineResult.apply(new BrightnessCombiner<>()).get(state.lightCoords);
        }
    }
 
    public void submit(BedRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) {
        SpriteId sprite = Sheets.getBedSprite(state.color);
        poseStack.pushPose();
        poseStack.mulPose(modelTransform(state.facing));
        this.submitPiece(state.part, sprite, poseStack, submitNodeCollector, state.lightCoords, OverlayTexture.NO_OVERLAY, state.breakProgress, 0);
        poseStack.popPose();
    }
 
    public void submitPiece(
        BedPart part,
        SpriteId sprite,
        PoseStack poseStack,
        SubmitNodeCollector submitNodeCollector,
        int lightCoords,
        int overlayCoords,
        ModelFeatureRenderer.@Nullable CrumblingOverlay breakProgress,
        int outlineColor
    ) {
        Model.Simple model = this.getPieceModel(part);
        submitNodeCollector.submitModel(model, Unit.INSTANCE, poseStack, lightCoords, overlayCoords, -1, sprite, this.sprites, outlineColor, breakProgress);
    }
 
    private Model.Simple getPieceModel(BedPart part) {
        return switch (part) {
            case HEAD -> this.headModel;
            case FOOT -> this.footModel;
        };
    }
 
    private static Transformation createModelTransform(Direction direction) {
        return new Transformation(
            new Matrix4f()
                .translation(0.0F, 0.5625F, 0.0F)
                .rotate(Axis.XP.rotationDegrees(90.0F))
                .rotateAround(Axis.ZP.rotationDegrees(180.0F + direction.toYRot()), 0.5F, 0.5F, 0.5F)
        );
    }
 
    public static Transformation modelTransform(Direction direction) {
        return TRANSFORMATIONS.get(direction);
    }
 
    public void getExtents(BedPart part, Consumer<Vector3fc> output) {
        PoseStack poseStack = new PoseStack();
        this.getPieceModel(part).root().getExtentsForGui(poseStack, output);
    }
}

引用的其他类