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;
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
BabyPandaModel()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
PandaModel()
- 引用位置:
-
- 引用位置:
继承
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
PandaHoldsItemLayer()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
HoldingEntityRenderState.extractHoldingEntityRenderState()
- 引用位置:
-
- 引用位置:
参数/构造调用/返回值 - 关联成员:
PandaRenderState()
- 引用位置:
-
- 引用位置:
字段/方法调用/返回值 - 关联成员:
Identifier.withDefaultNamespace()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Mth.floor(), Mth.frac(), Mth.lerp()
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置: