PandaRenderer.java

net.minecraft.client.renderer.entity.PandaRenderer

信息

  • 全限定名:net.minecraft.client.renderer.entity.PandaRenderer
  • 类型:public class
  • 包:net.minecraft.client.renderer.entity
  • 源码路径:src/main/java/net/minecraft/client/renderer/entity/PandaRenderer.java
  • 起始行号:L20
  • 继承:AgeableMobRenderer<Panda,PandaRenderState,PandaModel>
  • 职责:

    TODO

字段/常量

  • TEXTURES

    • 类型: Map<Panda.Gene,Identifier>
    • 修饰符: private static final
    • 源码定位: L21
    • 说明:

      TODO

  • BABY_TEXTURES

    • 类型: Map<Panda.Gene,Identifier>
    • 修饰符: private static final
    • 源码定位: L39
    • 说明:

      TODO

内部类/嵌套类型

构造器

public PandaRenderer(EntityRendererProvider.Context context) @ L58

  • 构造器名:PandaRenderer
  • 源码定位:L58
  • 修饰符:public

参数:

  • context: EntityRendererProvider.Context

说明:

TODO

方法

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

public Identifier getTextureLocation(PandaRenderState state) @ L63

  • 方法名:getTextureLocation
  • 源码定位:L63
  • 返回类型:Identifier
  • 修饰符:public

参数:

  • state: PandaRenderState

说明:

TODO

public PandaRenderState createRenderState() @ L68

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

参数:

说明:

TODO

public void extractRenderState(Panda entity, PandaRenderState state, float partialTicks) @ L72

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

参数:

  • entity: Panda
  • state: PandaRenderState
  • partialTicks: float

说明:

TODO

protected void setupRotations(PandaRenderState state, PoseStack poseStack, float bodyRot, float entityScale) @ L88

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

参数:

  • state: PandaRenderState
  • poseStack: PoseStack
  • bodyRot: float
  • entityScale: float

说明:

TODO

private float getAngle(float thisAngle, float nextAngle, int nextRollPos, float rollTransitionTime, float threshold) @ L148

  • 方法名:getAngle
  • 源码定位:L148
  • 返回类型:float
  • 修饰符:private

参数:

  • thisAngle: float
  • nextAngle: float
  • nextRollPos: int
  • rollTransitionTime: float
  • threshold: float

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class PandaRenderer extends AgeableMobRenderer<Panda, PandaRenderState, PandaModel> {
    private static final Map<Panda.Gene, Identifier> TEXTURES = Maps.newEnumMap(
        Map.of(
            Panda.Gene.NORMAL,
            Identifier.withDefaultNamespace("textures/entity/panda/panda.png"),
            Panda.Gene.LAZY,
            Identifier.withDefaultNamespace("textures/entity/panda/panda_lazy.png"),
            Panda.Gene.WORRIED,
            Identifier.withDefaultNamespace("textures/entity/panda/panda_worried.png"),
            Panda.Gene.PLAYFUL,
            Identifier.withDefaultNamespace("textures/entity/panda/panda_playful.png"),
            Panda.Gene.BROWN,
            Identifier.withDefaultNamespace("textures/entity/panda/panda_brown.png"),
            Panda.Gene.WEAK,
            Identifier.withDefaultNamespace("textures/entity/panda/panda_weak.png"),
            Panda.Gene.AGGRESSIVE,
            Identifier.withDefaultNamespace("textures/entity/panda/panda_aggressive.png")
        )
    );
    private static final Map<Panda.Gene, Identifier> BABY_TEXTURES = Maps.newEnumMap(
        Map.of(
            Panda.Gene.NORMAL,
            Identifier.withDefaultNamespace("textures/entity/panda/panda_baby.png"),
            Panda.Gene.LAZY,
            Identifier.withDefaultNamespace("textures/entity/panda/lazy_panda_baby.png"),
            Panda.Gene.WORRIED,
            Identifier.withDefaultNamespace("textures/entity/panda/worried_panda_baby.png"),
            Panda.Gene.PLAYFUL,
            Identifier.withDefaultNamespace("textures/entity/panda/playful_panda_baby.png"),
            Panda.Gene.BROWN,
            Identifier.withDefaultNamespace("textures/entity/panda/brown_panda_baby.png"),
            Panda.Gene.WEAK,
            Identifier.withDefaultNamespace("textures/entity/panda/weak_panda_baby.png"),
            Panda.Gene.AGGRESSIVE,
            Identifier.withDefaultNamespace("textures/entity/panda/aggressive_panda_baby.png")
        )
    );
 
    public PandaRenderer(EntityRendererProvider.Context context) {
        super(context, new PandaModel(context.bakeLayer(ModelLayers.PANDA)), new BabyPandaModel(context.bakeLayer(ModelLayers.PANDA_BABY)), 0.9F);
        this.addLayer(new PandaHoldsItemLayer(this));
    }
 
    public Identifier getTextureLocation(PandaRenderState state) {
        Map<Panda.Gene, Identifier> textures = state.isBaby ? BABY_TEXTURES : TEXTURES;
        return textures.getOrDefault(state.variant, textures.get(Panda.Gene.NORMAL));
    }
 
    public PandaRenderState createRenderState() {
        return new PandaRenderState();
    }
 
    public void extractRenderState(Panda entity, PandaRenderState state, float partialTicks) {
        super.extractRenderState(entity, state, partialTicks);
        HoldingEntityRenderState.extractHoldingEntityRenderState(entity, state, this.itemModelResolver);
        state.variant = entity.getVariant();
        state.isUnhappy = entity.getUnhappyCounter() > 0;
        state.isSneezing = entity.isSneezing();
        state.sneezeTime = entity.getSneezeCounter();
        state.isEating = entity.isEating();
        state.isScared = entity.isScared();
        state.isSitting = entity.isSitting();
        state.sitAmount = entity.getSitAmount(partialTicks);
        state.lieOnBackAmount = entity.getLieOnBackAmount(partialTicks);
        state.rollAmount = entity.isBaby() ? 0.0F : entity.getRollAmount(partialTicks);
        state.rollTime = entity.rollCounter > 0 ? entity.rollCounter + partialTicks : 0.0F;
    }
 
    protected void setupRotations(PandaRenderState state, PoseStack poseStack, float bodyRot, float entityScale) {
        super.setupRotations(state, poseStack, bodyRot, entityScale);
        if (state.rollTime > 0.0F) {
            float rollTransitionTime = Mth.frac(state.rollTime);
            int rollPos = Mth.floor(state.rollTime);
            int nextRollPos = rollPos + 1;
            float divider = 7.0F;
            float y = state.isBaby ? 0.3F : 0.8F;
            if (rollPos < 8.0F) {
                float thisAngle = 90.0F * rollPos / 7.0F;
                float nextAngle = 90.0F * nextRollPos / 7.0F;
                float angle = this.getAngle(thisAngle, nextAngle, nextRollPos, rollTransitionTime, 8.0F);
                poseStack.translate(0.0F, (y + 0.2F) * (angle / 90.0F), 0.0F);
                poseStack.mulPose(Axis.XP.rotationDegrees(-angle));
            } else if (rollPos < 16.0F) {
                float internalRollCounter = (rollPos - 8.0F) / 7.0F;
                float thisAngle = 90.0F + 90.0F * internalRollCounter;
                float nextAngle = 90.0F + 90.0F * (nextRollPos - 8.0F) / 7.0F;
                float angle = this.getAngle(thisAngle, nextAngle, nextRollPos, rollTransitionTime, 16.0F);
                poseStack.translate(0.0F, y + 0.2F + (y - 0.2F) * (angle - 90.0F) / 90.0F, 0.0F);
                poseStack.mulPose(Axis.XP.rotationDegrees(-angle));
            } else if (rollPos < 24.0F) {
                float internalRollCounter = (rollPos - 16.0F) / 7.0F;
                float thisAngle = 180.0F + 90.0F * internalRollCounter;
                float nextAngle = 180.0F + 90.0F * (nextRollPos - 16.0F) / 7.0F;
                float angle = this.getAngle(thisAngle, nextAngle, nextRollPos, rollTransitionTime, 24.0F);
                poseStack.translate(0.0F, y + y * (270.0F - angle) / 90.0F, 0.0F);
                poseStack.mulPose(Axis.XP.rotationDegrees(-angle));
            } else if (rollPos < 32) {
                float internalRollCounter = (rollPos - 24.0F) / 7.0F;
                float thisAngle = 270.0F + 90.0F * internalRollCounter;
                float nextAngle = 270.0F + 90.0F * (nextRollPos - 24.0F) / 7.0F;
                float angle = this.getAngle(thisAngle, nextAngle, nextRollPos, rollTransitionTime, 32.0F);
                poseStack.translate(0.0F, y * ((360.0F - angle) / 90.0F), 0.0F);
                poseStack.mulPose(Axis.XP.rotationDegrees(-angle));
            }
        }
 
        float sitAmount = state.sitAmount;
        if (sitAmount > 0.0F) {
            poseStack.translate(0.0F, 0.8F * sitAmount, 0.0F);
            poseStack.mulPose(Axis.XP.rotationDegrees(Mth.lerp(sitAmount, state.xRot, state.xRot + 90.0F)));
            poseStack.translate(0.0F, -1.0F * sitAmount, 0.0F);
            if (state.isScared) {
                float shakeRot = (float)(Math.cos(state.ageInTicks * 1.25F) * Math.PI * 0.05F);
                poseStack.mulPose(Axis.YP.rotationDegrees(shakeRot));
                if (state.isBaby) {
                    poseStack.translate(0.0F, 0.8F, 0.55F);
                }
            }
        }
 
        float lieOnBackAmount = state.lieOnBackAmount;
        if (lieOnBackAmount > 0.0F) {
            float y = state.isBaby ? 0.5F : 1.3F;
            poseStack.translate(0.0F, y * lieOnBackAmount, 0.0F);
            poseStack.mulPose(Axis.XP.rotationDegrees(Mth.lerp(lieOnBackAmount, state.xRot, state.xRot + 180.0F)));
        }
    }
 
    private float getAngle(float thisAngle, float nextAngle, int nextRollPos, float rollTransitionTime, float threshold) {
        return nextRollPos < threshold ? Mth.lerp(rollTransitionTime, thisAngle, nextAngle) : thisAngle;
    }
}

引用的其他类

  • PoseStack

    • 引用位置: 参数
  • BabyPandaModel

    • 引用位置: 构造调用
    • 关联成员: BabyPandaModel()
  • PandaModel

    • 引用位置: 构造调用
    • 关联成员: PandaModel()
  • AgeableMobRenderer

    • 引用位置: 继承
  • EntityRendererProvider

    • 引用位置: 参数
  • PandaHoldsItemLayer

    • 引用位置: 构造调用
    • 关联成员: PandaHoldsItemLayer()
  • HoldingEntityRenderState

    • 引用位置: 方法调用
    • 关联成员: HoldingEntityRenderState.extractHoldingEntityRenderState()
  • PandaRenderState

    • 引用位置: 参数/构造调用/返回值
    • 关联成员: PandaRenderState()
  • Identifier

    • 引用位置: 字段/方法调用/返回值
    • 关联成员: Identifier.withDefaultNamespace()
  • Mth

    • 引用位置: 方法调用
    • 关联成员: Mth.floor(), Mth.frac(), Mth.lerp()
  • Panda

    • 引用位置: 参数/字段