ItemFrameRenderer.java

net.minecraft.client.renderer.entity.ItemFrameRenderer

信息

  • 全限定名:net.minecraft.client.renderer.entity.ItemFrameRenderer
  • 类型:public class
  • 包:net.minecraft.client.renderer.entity
  • 源码路径:src/main/java/net/minecraft/client/renderer/entity/ItemFrameRenderer.java
  • 起始行号:L28
  • 继承:EntityRenderer<T,ItemFrameRenderState>
  • 职责:

    TODO

字段/常量

  • BLOCK_DISPLAY_CONTEXT

    • 类型: BlockDisplayContext
    • 修饰符: public static final
    • 源码定位: L29
    • 说明:

      TODO

  • GLOW_FRAME_BRIGHTNESS

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

      TODO

  • BRIGHT_MAP_LIGHT_ADJUSTMENT

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

      TODO

  • blockModelResolver

    • 类型: BlockModelResolver
    • 修饰符: private final
    • 源码定位: L32
    • 说明:

      TODO

  • itemModelResolver

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

      TODO

  • mapRenderer

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

      TODO

内部类/嵌套类型

构造器

public ItemFrameRenderer(EntityRendererProvider.Context context) @ L36

  • 构造器名:ItemFrameRenderer
  • 源码定位:L36
  • 修饰符:public

参数:

  • context: EntityRendererProvider.Context

说明:

TODO

方法

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

protected int getBlockLightLevel(T entity, BlockPos blockPos) @ L43

  • 方法名:getBlockLightLevel
  • 源码定位:L43
  • 返回类型:int
  • 修饰符:protected

参数:

  • entity: T
  • blockPos: BlockPos

说明:

TODO

public void submit(ItemFrameRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) @ L47

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

参数:

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

说明:

TODO

private int getLightCoords(boolean isGlowFrame, int glowLightCoords, int originalLightCoords) @ L100

  • 方法名:getLightCoords
  • 源码定位:L100
  • 返回类型:int
  • 修饰符:private

参数:

  • isGlowFrame: boolean
  • glowLightCoords: int
  • originalLightCoords: int

说明:

TODO

public Vec3 getRenderOffset(ItemFrameRenderState state) @ L104

  • 方法名:getRenderOffset
  • 源码定位:L104
  • 返回类型:Vec3
  • 修饰符:public

参数:

  • state: ItemFrameRenderState

说明:

TODO

protected boolean shouldShowName(T entity, double distanceToCameraSq) @ L108

  • 方法名:shouldShowName
  • 源码定位:L108
  • 返回类型:boolean
  • 修饰符:protected

参数:

  • entity: T
  • distanceToCameraSq: double

说明:

TODO

protected Component getNameTag(T entity) @ L112

  • 方法名:getNameTag
  • 源码定位:L112
  • 返回类型:Component
  • 修饰符:protected

参数:

  • entity: T

说明:

TODO

public ItemFrameRenderState createRenderState() @ L116

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

参数:

说明:

TODO

public void extractRenderState(T entity, ItemFrameRenderState state, float partialTicks) @ L120

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

参数:

  • entity: T
  • state: ItemFrameRenderState
  • partialTicks: float

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class ItemFrameRenderer<T extends ItemFrame> extends EntityRenderer<T, ItemFrameRenderState> {
    public static final BlockDisplayContext BLOCK_DISPLAY_CONTEXT = BlockDisplayContext.create();
    public static final int GLOW_FRAME_BRIGHTNESS = 5;
    public static final int BRIGHT_MAP_LIGHT_ADJUSTMENT = 30;
    private final BlockModelResolver blockModelResolver;
    private final ItemModelResolver itemModelResolver;
    private final MapRenderer mapRenderer;
 
    public ItemFrameRenderer(EntityRendererProvider.Context context) {
        super(context);
        this.blockModelResolver = context.getBlockModelResolver();
        this.itemModelResolver = context.getItemModelResolver();
        this.mapRenderer = context.getMapRenderer();
    }
 
    protected int getBlockLightLevel(T entity, BlockPos blockPos) {
        return entity.is(EntityType.GLOW_ITEM_FRAME) ? Math.max(5, super.getBlockLightLevel(entity, blockPos)) : super.getBlockLightLevel(entity, blockPos);
    }
 
    public void submit(ItemFrameRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) {
        super.submit(state, poseStack, submitNodeCollector, camera);
        poseStack.pushPose();
        Direction direction = state.direction;
        Vec3 renderOffset = this.getRenderOffset(state);
        poseStack.translate(-renderOffset.x(), -renderOffset.y(), -renderOffset.z());
        double offs = 0.46875;
        poseStack.translate(direction.getStepX() * 0.46875, direction.getStepY() * 0.46875, direction.getStepZ() * 0.46875);
        float xRot;
        float yRot;
        if (direction.getAxis().isHorizontal()) {
            xRot = 0.0F;
            yRot = 180.0F - direction.toYRot();
        } else {
            xRot = -90 * direction.getAxisDirection().getStep();
            yRot = 180.0F;
        }
 
        poseStack.mulPose(Axis.XP.rotationDegrees(xRot));
        poseStack.mulPose(Axis.YP.rotationDegrees(yRot));
        if (!state.frameModel.isEmpty()) {
            poseStack.pushPose();
            poseStack.translate(-0.5F, -0.5F, -0.5F);
            state.frameModel.submitWithZOffset(poseStack, submitNodeCollector, state.lightCoords, OverlayTexture.NO_OVERLAY, state.outlineColor);
            poseStack.popPose();
        }
 
        if (state.isInvisible) {
            poseStack.translate(0.0F, 0.0F, 0.5F);
        } else {
            poseStack.translate(0.0F, 0.0F, 0.4375F);
        }
 
        if (state.mapId != null) {
            int rotation = state.rotation % 4 * 2;
            poseStack.mulPose(Axis.ZP.rotationDegrees(rotation * 360.0F / 8.0F));
            poseStack.mulPose(Axis.ZP.rotationDegrees(180.0F));
            float s = 0.0078125F;
            poseStack.scale(0.0078125F, 0.0078125F, 0.0078125F);
            poseStack.translate(-64.0F, -64.0F, 0.0F);
            poseStack.translate(0.0F, 0.0F, -1.0F);
            int lightCoords = this.getLightCoords(state.isGlowFrame, 15728850, state.lightCoords);
            this.mapRenderer.render(state.mapRenderState, poseStack, submitNodeCollector, true, lightCoords);
        } else if (!state.item.isEmpty()) {
            poseStack.mulPose(Axis.ZP.rotationDegrees(state.rotation * 360.0F / 8.0F));
            int lightVal = this.getLightCoords(state.isGlowFrame, 15728880, state.lightCoords);
            poseStack.scale(0.5F, 0.5F, 0.5F);
            state.item.submit(poseStack, submitNodeCollector, lightVal, OverlayTexture.NO_OVERLAY, state.outlineColor);
        }
 
        poseStack.popPose();
    }
 
    private int getLightCoords(boolean isGlowFrame, int glowLightCoords, int originalLightCoords) {
        return isGlowFrame ? glowLightCoords : originalLightCoords;
    }
 
    public Vec3 getRenderOffset(ItemFrameRenderState state) {
        return new Vec3(state.direction.getStepX() * 0.3F, -0.25, state.direction.getStepZ() * 0.3F);
    }
 
    protected boolean shouldShowName(T entity, double distanceToCameraSq) {
        return Minecraft.renderNames() && this.entityRenderDispatcher.crosshairPickEntity == entity && entity.getItem().getCustomName() != null;
    }
 
    protected Component getNameTag(T entity) {
        return entity.getItem().getHoverName();
    }
 
    public ItemFrameRenderState createRenderState() {
        return new ItemFrameRenderState();
    }
 
    public void extractRenderState(T entity, ItemFrameRenderState state, float partialTicks) {
        super.extractRenderState(entity, state, partialTicks);
        state.direction = entity.getDirection();
        ItemStack itemStack = entity.getItem();
        this.itemModelResolver.updateForNonLiving(state.item, itemStack, ItemDisplayContext.FIXED, entity);
        state.rotation = entity.getRotation();
        state.isGlowFrame = entity.is(EntityType.GLOW_ITEM_FRAME);
        state.mapId = null;
        if (!itemStack.isEmpty()) {
            MapId framedMapId = entity.getFramedMapId(itemStack);
            if (framedMapId != null) {
                MapItemSavedData mapData = entity.level().getMapData(framedMapId);
                if (mapData != null) {
                    this.mapRenderer.extractRenderState(framedMapId, mapData, state.mapRenderState);
                    state.mapId = framedMapId;
                }
            }
        }
 
        if (!state.isInvisible) {
            this.blockModelResolver.updateForItemFrame(state.frameModel, state.isGlowFrame, state.mapId != null);
        } else {
            state.frameModel.clear();
        }
    }
}

引用的其他类