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;
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
字段/构造调用 - 关联成员:
MinecartModel()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
字段
- 引用位置:
-
- 引用位置:
字段/方法调用 - 关联成员:
BlockDisplayContext.create()
- 引用位置:
-
- 引用位置:
继承
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
返回值
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
字段/方法调用 - 关联成员:
Identifier.withDefaultNamespace()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Mth.sin()
- 引用位置:
-
- 引用位置:
返回值
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
返回值
- 引用位置:
-
- 引用位置:
返回值
- 引用位置: