ShelfRenderer.java

net.minecraft.client.renderer.blockentity.ShelfRenderer

信息

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

    TODO

字段/常量

  • ITEM_SIZE

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

      TODO

  • ALIGN_ITEMS_TO_BOTTOM

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

      TODO

  • itemModelResolver

    • 类型: ItemModelResolver
    • 修饰符: private final
    • 源码定位: L28
    • 说明:

      TODO

内部类/嵌套类型

构造器

public ShelfRenderer(BlockEntityRendererProvider.Context context) @ L30

  • 构造器名:ShelfRenderer
  • 源码定位:L30
  • 修饰符:public

参数:

  • context: BlockEntityRendererProvider.Context

说明:

TODO

方法

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

public ShelfRenderState createRenderState() @ L34

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

参数:

说明:

TODO

public void extractRenderState(ShelfBlockEntity blockEntity, ShelfRenderState state, float partialTicks, Vec3 cameraPosition, ModelFeatureRenderer.CrumblingOverlay breakProgress) @ L38

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

参数:

  • blockEntity: ShelfBlockEntity
  • state: ShelfRenderState
  • partialTicks: float
  • cameraPosition: Vec3
  • breakProgress: ModelFeatureRenderer.CrumblingOverlay

说明:

TODO

public void submit(ShelfRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) @ L62

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

参数:

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

说明:

TODO

private void submitItem(ShelfRenderState state, ItemStackRenderState itemStackRenderState, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int slot, float yRot) @ L73

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

参数:

  • state: ShelfRenderState
  • itemStackRenderState: ItemStackRenderState
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • slot: int
  • yRot: float

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class ShelfRenderer implements BlockEntityRenderer<ShelfBlockEntity, ShelfRenderState> {
    private static final float ITEM_SIZE = 0.25F;
    private static final float ALIGN_ITEMS_TO_BOTTOM = -0.25F;
    private final ItemModelResolver itemModelResolver;
 
    public ShelfRenderer(BlockEntityRendererProvider.Context context) {
        this.itemModelResolver = context.itemModelResolver();
    }
 
    public ShelfRenderState createRenderState() {
        return new ShelfRenderState();
    }
 
    public void extractRenderState(
        ShelfBlockEntity blockEntity,
        ShelfRenderState state,
        float partialTicks,
        Vec3 cameraPosition,
        ModelFeatureRenderer.@Nullable CrumblingOverlay breakProgress
    ) {
        BlockEntityRenderer.super.extractRenderState(blockEntity, state, partialTicks, cameraPosition, breakProgress);
        state.alignToBottom = blockEntity.getAlignItemsToBottom();
        state.facing = blockEntity.getBlockState().getValue(ShelfBlock.FACING);
        NonNullList<ItemStack> items = blockEntity.getItems();
        int seed = HashCommon.long2int(blockEntity.getBlockPos().asLong());
 
        for (int slot = 0; slot < items.size(); slot++) {
            ItemStack itemStack = items.get(slot);
            if (!itemStack.isEmpty()) {
                ItemStackRenderState itemStackRenderState = new ItemStackRenderState();
                this.itemModelResolver
                    .updateForTopItem(itemStackRenderState, itemStack, ItemDisplayContext.ON_SHELF, blockEntity.level(), blockEntity, seed + slot);
                state.items[slot] = itemStackRenderState;
            }
        }
    }
 
    public void submit(ShelfRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) {
        float yRot = state.facing.getAxis().isHorizontal() ? -state.facing.toYRot() : 180.0F;
 
        for (int slot = 0; slot < state.items.length; slot++) {
            ItemStackRenderState itemStackRenderState = state.items[slot];
            if (itemStackRenderState != null) {
                this.submitItem(state, itemStackRenderState, poseStack, submitNodeCollector, slot, yRot);
            }
        }
    }
 
    private void submitItem(
        ShelfRenderState state, ItemStackRenderState itemStackRenderState, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int slot, float yRot
    ) {
        float itemSlotPosition = (slot - 1) * 0.3125F;
        Vec3 itemOffset = new Vec3(itemSlotPosition, state.alignToBottom ? -0.25 : 0.0, -0.25);
        poseStack.pushPose();
        poseStack.translate(0.5F, 0.5F, 0.5F);
        poseStack.mulPose(Axis.YP.rotationDegrees(yRot));
        poseStack.translate(itemOffset);
        poseStack.scale(0.25F, 0.25F, 0.25F);
        AABB box = itemStackRenderState.getModelBoundingBox();
        double offsetY = -box.minY;
        if (!state.alignToBottom) {
            offsetY += -(box.maxY - box.minY) / 2.0;
        }
 
        poseStack.translate(0.0, offsetY, 0.0);
        itemStackRenderState.submit(poseStack, submitNodeCollector, state.lightCoords, OverlayTexture.NO_OVERLAY, 0);
        poseStack.popPose();
    }
}

引用的其他类