AbstractMinecartRenderer.java

net.minecraft.client.renderer.entity.AbstractMinecartRenderer

信息

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

    TODO

字段/常量

  • MINECART_LOCATION

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

      TODO

  • DISPLAY_BLOCK_SCALE

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

      TODO

  • BLOCK_DISPLAY_CONTEXT

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

      TODO

  • model

    • 类型: MinecartModel
    • 修饰符: protected final
    • 源码定位: L30
    • 说明:

      TODO

  • blockModelResolver

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

      TODO

内部类/嵌套类型

构造器

public AbstractMinecartRenderer(EntityRendererProvider.Context context, ModelLayerLocation model) @ L33

  • 构造器名:AbstractMinecartRenderer
  • 源码定位:L33
  • 修饰符:public

参数:

  • context: EntityRendererProvider.Context
  • model: ModelLayerLocation

说明:

TODO

方法

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

public void submit(S state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) @ L40

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

参数:

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

说明:

TODO

private static <S extends MinecartRenderState> void newRender(S state, PoseStack poseStack) @ L74

  • 方法名:newRender
  • 源码定位:L74
  • 返回类型: void
  • 修饰符:private static

参数:

  • state: S
  • poseStack: PoseStack

说明:

TODO

private static <S extends MinecartRenderState> void oldRender(S state, PoseStack poseStack) @ L80

  • 方法名:oldRender
  • 源码定位:L80
  • 返回类型: void
  • 修饰符:private static

参数:

  • state: S
  • poseStack: PoseStack

说明:

TODO

public void extractRenderState(T entity, S state, float partialTicks) @ L103

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

参数:

  • entity: T
  • state: S
  • partialTicks: float

说明:

TODO

private static <T extends AbstractMinecart,S extends MinecartRenderState> void newExtractState(T entity, NewMinecartBehavior behavior, S state, float partialTicks) @ L122

  • 方法名:newExtractState
  • 源码定位:L122
  • 返回类型:<T extends AbstractMinecart,S extends MinecartRenderState> void
  • 修饰符:private static

参数:

  • entity: T
  • behavior: NewMinecartBehavior
  • state: S
  • partialTicks: float

说明:

TODO

private static <T extends AbstractMinecart,S extends MinecartRenderState> void oldExtractState(T entity, OldMinecartBehavior behavior, S state, float partialTicks) @ L136

  • 方法名:oldExtractState
  • 源码定位:L136
  • 返回类型:<T extends AbstractMinecart,S extends MinecartRenderState> void
  • 修饰符:private static

参数:

  • entity: T
  • behavior: OldMinecartBehavior
  • state: S
  • partialTicks: float

说明:

TODO

protected void submitMinecartContents(S state, BlockModelRenderState blockModel, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords) @ L159

  • 方法名:submitMinecartContents
  • 源码定位:L159
  • 返回类型:void
  • 修饰符:protected

参数:

  • state: S
  • blockModel: BlockModelRenderState
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • lightCoords: int

说明:

TODO

protected AABB getBoundingBoxForCulling(T entity) @ L165

  • 方法名:getBoundingBoxForCulling
  • 源码定位:L165
  • 返回类型:AABB
  • 修饰符:protected

参数:

  • entity: T

说明:

TODO

public Vec3 getRenderOffset(S state) @ L170

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

参数:

  • state: S

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public abstract class AbstractMinecartRenderer<T extends AbstractMinecart, S extends MinecartRenderState> extends EntityRenderer<T, S> {
    private static final Identifier MINECART_LOCATION = Identifier.withDefaultNamespace("textures/entity/minecart/minecart.png");
    private static final float DISPLAY_BLOCK_SCALE = 0.75F;
    public static final BlockDisplayContext BLOCK_DISPLAY_CONTEXT = BlockDisplayContext.create();
    protected final MinecartModel model;
    private final BlockModelResolver blockModelResolver;
 
    public AbstractMinecartRenderer(EntityRendererProvider.Context context, ModelLayerLocation model) {
        super(context);
        this.shadowRadius = 0.7F;
        this.model = new MinecartModel(context.bakeLayer(model));
        this.blockModelResolver = context.getBlockModelResolver();
    }
 
    public void submit(S state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) {
        super.submit(state, poseStack, submitNodeCollector, camera);
        poseStack.pushPose();
        long seed = state.offsetSeed;
        float offsetX = (((float)(seed >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F;
        float offsetY = (((float)(seed >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F;
        float offsetZ = (((float)(seed >> 24 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F;
        poseStack.translate(offsetX, offsetY, offsetZ);
        if (state.isNewRender) {
            newRender(state, poseStack);
        } else {
            oldRender(state, poseStack);
        }
 
        float hurt = state.hurtTime;
        if (hurt > 0.0F) {
            poseStack.mulPose(Axis.XP.rotationDegrees(Mth.sin(hurt) * hurt * state.damageTime / 10.0F * state.hurtDir));
        }
 
        BlockModelRenderState displayBlockModel = state.displayBlockModel;
        if (!displayBlockModel.isEmpty()) {
            poseStack.pushPose();
            poseStack.scale(0.75F, 0.75F, 0.75F);
            poseStack.translate(-0.5F, (state.displayOffset - 8) / 16.0F, 0.5F);
            poseStack.mulPose(Axis.YP.rotationDegrees(90.0F));
            this.submitMinecartContents(state, displayBlockModel, poseStack, submitNodeCollector, state.lightCoords);
            poseStack.popPose();
        }
 
        poseStack.scale(-1.0F, -1.0F, 1.0F);
        submitNodeCollector.submitModel(this.model, state, poseStack, MINECART_LOCATION, state.lightCoords, OverlayTexture.NO_OVERLAY, state.outlineColor, null);
        poseStack.popPose();
    }
 
    private static <S extends MinecartRenderState> void newRender(S state, PoseStack poseStack) {
        poseStack.mulPose(Axis.YP.rotationDegrees(state.yRot));
        poseStack.mulPose(Axis.ZP.rotationDegrees(-state.xRot));
        poseStack.translate(0.0F, 0.375F, 0.0F);
    }
 
    private static <S extends MinecartRenderState> void oldRender(S state, PoseStack poseStack) {
        double entityX = state.x;
        double entityY = state.y;
        double entityZ = state.z;
        float xRot = state.xRot;
        float rotation = state.yRot;
        if (state.posOnRail != null && state.frontPos != null && state.backPos != null) {
            Vec3 frontPos = state.frontPos;
            Vec3 backPos = state.backPos;
            poseStack.translate(state.posOnRail.x - entityX, (frontPos.y + backPos.y) / 2.0 - entityY, state.posOnRail.z - entityZ);
            Vec3 direction = backPos.add(-frontPos.x, -frontPos.y, -frontPos.z);
            if (direction.length() != 0.0) {
                direction = direction.normalize();
                rotation = (float)(Math.atan2(direction.z, direction.x) * 180.0 / Math.PI);
                xRot = (float)(Math.atan(direction.y) * 73.0);
            }
        }
 
        poseStack.translate(0.0F, 0.375F, 0.0F);
        poseStack.mulPose(Axis.YP.rotationDegrees(180.0F - rotation));
        poseStack.mulPose(Axis.ZP.rotationDegrees(-xRot));
    }
 
    public void extractRenderState(T entity, S state, float partialTicks) {
        super.extractRenderState(entity, state, partialTicks);
        if (entity.getBehavior() instanceof NewMinecartBehavior behavior) {
            newExtractState(entity, behavior, state, partialTicks);
            state.isNewRender = true;
        } else if (entity.getBehavior() instanceof OldMinecartBehavior behavior) {
            oldExtractState(entity, behavior, state, partialTicks);
            state.isNewRender = false;
        }
 
        long seed = entity.getId() * 493286711L;
        state.offsetSeed = seed * seed * 4392167121L + seed * 98761L;
        state.hurtTime = entity.getHurtTime() - partialTicks;
        state.hurtDir = entity.getHurtDir();
        state.damageTime = Math.max(entity.getDamage() - partialTicks, 0.0F);
        state.displayOffset = entity.getDisplayOffset();
        this.blockModelResolver.update(state.displayBlockModel, entity.getDisplayBlockState(), BLOCK_DISPLAY_CONTEXT);
    }
 
    private static <T extends AbstractMinecart, S extends MinecartRenderState> void newExtractState(
        T entity, NewMinecartBehavior behavior, S state, float partialTicks
    ) {
        if (behavior.cartHasPosRotLerp()) {
            state.renderPos = behavior.getCartLerpPosition(partialTicks);
            state.xRot = behavior.getCartLerpXRot(partialTicks);
            state.yRot = behavior.getCartLerpYRot(partialTicks);
        } else {
            state.renderPos = null;
            state.xRot = entity.getXRot();
            state.yRot = entity.getYRot();
        }
    }
 
    private static <T extends AbstractMinecart, S extends MinecartRenderState> void oldExtractState(
        T entity, OldMinecartBehavior behavior, S state, float partialTicks
    ) {
        float HALF_LENGTH = 0.3F;
        state.xRot = entity.getXRot(partialTicks);
        state.yRot = entity.getYRot(partialTicks);
        double entityX = state.x;
        double entityY = state.y;
        double entityZ = state.z;
        Vec3 pos = behavior.getPos(entityX, entityY, entityZ);
        if (pos != null) {
            state.posOnRail = pos;
            Vec3 p0 = behavior.getPosOffs(entityX, entityY, entityZ, 0.3F);
            Vec3 p1 = behavior.getPosOffs(entityX, entityY, entityZ, -0.3F);
            state.frontPos = Objects.requireNonNullElse(p0, pos);
            state.backPos = Objects.requireNonNullElse(p1, pos);
        } else {
            state.posOnRail = null;
            state.frontPos = null;
            state.backPos = null;
        }
    }
 
    protected void submitMinecartContents(
        S state, BlockModelRenderState blockModel, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords
    ) {
        blockModel.submit(poseStack, submitNodeCollector, lightCoords, OverlayTexture.NO_OVERLAY, state.outlineColor);
    }
 
    protected AABB getBoundingBoxForCulling(T entity) {
        AABB aabb = super.getBoundingBoxForCulling(entity);
        return !entity.getDisplayBlockState().isAir() ? aabb.expandTowards(0.0, entity.getDisplayOffset() * 0.75F / 16.0F, 0.0) : aabb;
    }
 
    public Vec3 getRenderOffset(S state) {
        Vec3 offset = super.getRenderOffset(state);
        return state.isNewRender && state.renderPos != null
            ? offset.add(state.renderPos.x - state.x, state.renderPos.y - state.y, state.renderPos.z - state.z)
            : offset;
    }
}

引用的其他类