GuardianRenderer.java
net.minecraft.client.renderer.entity.GuardianRenderer
信息
- 全限定名:net.minecraft.client.renderer.entity.GuardianRenderer
- 类型:public class
- 包:net.minecraft.client.renderer.entity
- 源码路径:src/main/java/net/minecraft/client/renderer/entity/GuardianRenderer.java
- 起始行号:L29
- 继承:MobRenderer<Guardian,GuardianRenderState,GuardianModel>
- 职责:
TODO
字段/常量
-
GUARDIAN_LOCATION- 类型:
Identifier - 修饰符:
private static final - 源码定位:
L30 - 说明:
TODO
- 类型:
-
GUARDIAN_BEAM_LOCATION- 类型:
Identifier - 修饰符:
private static final - 源码定位:
L31 - 说明:
TODO
- 类型:
-
BEAM_RENDER_TYPE- 类型:
RenderType - 修饰符:
private static final - 源码定位:
L32 - 说明:
TODO
- 类型:
内部类/嵌套类型
- 无
构造器
public GuardianRenderer(EntityRendererProvider.Context context) @ L34
- 构造器名:GuardianRenderer
- 源码定位:L34
- 修饰符:public
参数:
- context: EntityRendererProvider.Context
说明:
TODO
protected GuardianRenderer(EntityRendererProvider.Context context, float shadow, ModelLayerLocation modelId) @ L38
- 构造器名:GuardianRenderer
- 源码定位:L38
- 修饰符:protected
参数:
- context: EntityRendererProvider.Context
- shadow: float
- modelId: ModelLayerLocation
说明:
TODO
方法
下面的方法块按源码顺序生成。
public boolean shouldRender(Guardian entity, Frustum culler, double camX, double camY, double camZ) @ L42
- 方法名:shouldRender
- 源码定位:L42
- 返回类型:boolean
- 修饰符:public
参数:
- entity: Guardian
- culler: Frustum
- camX: double
- camY: double
- camZ: double
说明:
TODO
private Vec3 getPosition(LivingEntity entity, double yOffset, float partialTicks) @ L59
- 方法名:getPosition
- 源码定位:L59
- 返回类型:Vec3
- 修饰符:private
参数:
- entity: LivingEntity
- yOffset: double
- partialTicks: float
说明:
TODO
public void submit(GuardianRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) @ L66
- 方法名:submit
- 源码定位:L66
- 返回类型:void
- 修饰符:public
参数:
- state: GuardianRenderState
- poseStack: PoseStack
- submitNodeCollector: SubmitNodeCollector
- camera: CameraRenderState
说明:
TODO
private static void renderBeam(PoseStack poseStack, SubmitNodeCollector submitNodeCollector, Vec3 beamVector, float timeInTicks, float scale, float texVOff) @ L78
- 方法名:renderBeam
- 源码定位:L78
- 返回类型:void
- 修饰符:private static
参数:
- poseStack: PoseStack
- submitNodeCollector: SubmitNodeCollector
- beamVector: Vec3
- timeInTicks: float
- scale: float
- texVOff: float
说明:
TODO
private static void vertex(VertexConsumer builder, PoseStack.Pose pose, float x, float y, float z, int red, int green, int blue, float u, float v) @ L129
- 方法名:vertex
- 源码定位:L129
- 返回类型:void
- 修饰符:private static
参数:
- builder: VertexConsumer
- pose: PoseStack.Pose
- x: float
- y: float
- z: float
- red: int
- green: int
- blue: int
- u: float
- v: float
说明:
TODO
public Identifier getTextureLocation(GuardianRenderState state) @ L138
- 方法名:getTextureLocation
- 源码定位:L138
- 返回类型:Identifier
- 修饰符:public
参数:
- state: GuardianRenderState
说明:
TODO
public GuardianRenderState createRenderState() @ L142
- 方法名:createRenderState
- 源码定位:L142
- 返回类型:GuardianRenderState
- 修饰符:public
参数:
- 无
说明:
TODO
public void extractRenderState(Guardian entity, GuardianRenderState state, float partialTicks) @ L146
- 方法名:extractRenderState
- 源码定位:L146
- 返回类型:void
- 修饰符:public
参数:
- entity: Guardian
- state: GuardianRenderState
- partialTicks: float
说明:
TODO
private static Entity getEntityToLookAt(Guardian entity) @ L170
- 方法名:getEntityToLookAt
- 源码定位:L170
- 返回类型:Entity
- 修饰符:private static
参数:
- entity: Guardian
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public class GuardianRenderer extends MobRenderer<Guardian, GuardianRenderState, GuardianModel> {
private static final Identifier GUARDIAN_LOCATION = Identifier.withDefaultNamespace("textures/entity/guardian/guardian.png");
private static final Identifier GUARDIAN_BEAM_LOCATION = Identifier.withDefaultNamespace("textures/entity/guardian/guardian_beam.png");
private static final RenderType BEAM_RENDER_TYPE = RenderTypes.entityCutout(GUARDIAN_BEAM_LOCATION);
public GuardianRenderer(EntityRendererProvider.Context context) {
this(context, 0.5F, ModelLayers.GUARDIAN);
}
protected GuardianRenderer(EntityRendererProvider.Context context, float shadow, ModelLayerLocation modelId) {
super(context, new GuardianModel(context.bakeLayer(modelId)), shadow);
}
public boolean shouldRender(Guardian entity, Frustum culler, double camX, double camY, double camZ) {
if (super.shouldRender(entity, culler, camX, camY, camZ)) {
return true;
} else {
if (entity.hasActiveAttackTarget()) {
LivingEntity lookAtEntity = entity.getActiveAttackTarget();
if (lookAtEntity != null) {
Vec3 targetPos = this.getPosition(lookAtEntity, lookAtEntity.getBbHeight() * 0.5, 1.0F);
Vec3 startPos = this.getPosition(entity, entity.getEyeHeight(), 1.0F);
return culler.isVisible(new AABB(startPos.x, startPos.y, startPos.z, targetPos.x, targetPos.y, targetPos.z));
}
}
return false;
}
}
private Vec3 getPosition(LivingEntity entity, double yOffset, float partialTicks) {
double sx = Mth.lerp((double)partialTicks, entity.xOld, entity.getX());
double sy = Mth.lerp((double)partialTicks, entity.yOld, entity.getY()) + yOffset;
double sz = Mth.lerp((double)partialTicks, entity.zOld, entity.getZ());
return new Vec3(sx, sy, sz);
}
public void submit(GuardianRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) {
super.submit(state, poseStack, submitNodeCollector, camera);
Vec3 targetPosition = state.attackTargetPosition;
if (targetPosition != null) {
float texVOff = state.attackTime * 0.5F % 1.0F;
poseStack.pushPose();
poseStack.translate(0.0F, state.eyeHeight, 0.0F);
renderBeam(poseStack, submitNodeCollector, targetPosition.subtract(state.eyePosition), state.attackTime, state.attackScale, texVOff);
poseStack.popPose();
}
}
private static void renderBeam(PoseStack poseStack, SubmitNodeCollector submitNodeCollector, Vec3 beamVector, float timeInTicks, float scale, float texVOff) {
float length = (float)(beamVector.length() + 1.0);
beamVector = beamVector.normalize();
float xRot = (float)Math.acos(beamVector.y);
float yRot = (float) (Math.PI / 2) - (float)Math.atan2(beamVector.z, beamVector.x);
poseStack.mulPose(Axis.YP.rotationDegrees(yRot * (180.0F / (float)Math.PI)));
poseStack.mulPose(Axis.XP.rotationDegrees(xRot * (180.0F / (float)Math.PI)));
float rot = timeInTicks * 0.05F * -1.5F;
float colorScale = scale * scale;
int red = 64 + (int)(colorScale * 191.0F);
int green = 32 + (int)(colorScale * 191.0F);
int blue = 128 - (int)(colorScale * 64.0F);
float rr1 = 0.2F;
float rr2 = 0.282F;
float wnx = Mth.cos(rot + (float) (Math.PI * 3.0 / 4.0)) * 0.282F;
float wnz = Mth.sin(rot + (float) (Math.PI * 3.0 / 4.0)) * 0.282F;
float enx = Mth.cos(rot + (float) (Math.PI / 4)) * 0.282F;
float enz = Mth.sin(rot + (float) (Math.PI / 4)) * 0.282F;
float wsx = Mth.cos(rot + ((float) Math.PI * 5.0F / 4.0F)) * 0.282F;
float wsz = Mth.sin(rot + ((float) Math.PI * 5.0F / 4.0F)) * 0.282F;
float esx = Mth.cos(rot + ((float) Math.PI * 7.0F / 4.0F)) * 0.282F;
float esz = Mth.sin(rot + ((float) Math.PI * 7.0F / 4.0F)) * 0.282F;
float wx = Mth.cos(rot + (float) Math.PI) * 0.2F;
float wz = Mth.sin(rot + (float) Math.PI) * 0.2F;
float ex = Mth.cos(rot + 0.0F) * 0.2F;
float ez = Mth.sin(rot + 0.0F) * 0.2F;
float nx = Mth.cos(rot + (float) (Math.PI / 2)) * 0.2F;
float nz = Mth.sin(rot + (float) (Math.PI / 2)) * 0.2F;
float sx = Mth.cos(rot + (float) (Math.PI * 3.0 / 2.0)) * 0.2F;
float sz = Mth.sin(rot + (float) (Math.PI * 3.0 / 2.0)) * 0.2F;
float minU = 0.0F;
float maxU = 0.4999F;
float minV = -1.0F + texVOff;
float maxV = minV + length * 2.5F;
submitNodeCollector.submitCustomGeometry(poseStack, BEAM_RENDER_TYPE, (pose, buffer) -> {
vertex(buffer, pose, wx, length, wz, red, green, blue, 0.4999F, maxV);
vertex(buffer, pose, wx, 0.0F, wz, red, green, blue, 0.4999F, minV);
vertex(buffer, pose, ex, 0.0F, ez, red, green, blue, 0.0F, minV);
vertex(buffer, pose, ex, length, ez, red, green, blue, 0.0F, maxV);
vertex(buffer, pose, nx, length, nz, red, green, blue, 0.4999F, maxV);
vertex(buffer, pose, nx, 0.0F, nz, red, green, blue, 0.4999F, minV);
vertex(buffer, pose, sx, 0.0F, sz, red, green, blue, 0.0F, minV);
vertex(buffer, pose, sx, length, sz, red, green, blue, 0.0F, maxV);
float vBase = Mth.floor(timeInTicks) % 2 == 0 ? 0.5F : 0.0F;
vertex(buffer, pose, wnx, length, wnz, red, green, blue, 0.5F, vBase + 0.5F);
vertex(buffer, pose, enx, length, enz, red, green, blue, 1.0F, vBase + 0.5F);
vertex(buffer, pose, esx, length, esz, red, green, blue, 1.0F, vBase);
vertex(buffer, pose, wsx, length, wsz, red, green, blue, 0.5F, vBase);
});
}
private static void vertex(VertexConsumer builder, PoseStack.Pose pose, float x, float y, float z, int red, int green, int blue, float u, float v) {
builder.addVertex(pose, x, y, z)
.setColor(red, green, blue, 255)
.setUv(u, v)
.setOverlay(OverlayTexture.NO_OVERLAY)
.setLight(15728880)
.setNormal(pose, 0.0F, 1.0F, 0.0F);
}
public Identifier getTextureLocation(GuardianRenderState state) {
return GUARDIAN_LOCATION;
}
public GuardianRenderState createRenderState() {
return new GuardianRenderState();
}
public void extractRenderState(Guardian entity, GuardianRenderState state, float partialTicks) {
super.extractRenderState(entity, state, partialTicks);
state.spikesAnimation = entity.getSpikesAnimation(partialTicks);
state.tailAnimation = entity.getTailAnimation(partialTicks);
state.eyePosition = entity.getEyePosition(partialTicks);
Entity lookAtEntity = getEntityToLookAt(entity);
if (lookAtEntity != null) {
state.lookDirection = entity.getViewVector(partialTicks);
state.lookAtPosition = lookAtEntity.getEyePosition(partialTicks);
} else {
state.lookDirection = null;
state.lookAtPosition = null;
}
LivingEntity targetEntity = entity.getActiveAttackTarget();
if (targetEntity != null) {
state.attackScale = entity.getAttackAnimationScale(partialTicks);
state.attackTime = entity.getClientSideAttackTime() + partialTicks;
state.attackTargetPosition = this.getPosition(targetEntity, targetEntity.getBbHeight() * 0.5, partialTicks);
} else {
state.attackTargetPosition = null;
}
}
private static @Nullable Entity getEntityToLookAt(Guardian entity) {
Entity lookAtEntity = Minecraft.getInstance().getCameraEntity();
return (Entity)(entity.hasActiveAttackTarget() ? entity.getActiveAttackTarget() : lookAtEntity);
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Minecraft.getInstance()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
GuardianModel()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
继承
- 引用位置:
-
- 引用位置:
参数/构造调用/返回值 - 关联成员:
GuardianRenderState()
- 引用位置:
-
- 引用位置:
字段
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
RenderTypes.entityCutout()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
字段/方法调用/返回值 - 关联成员:
Identifier.withDefaultNamespace()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Mth.cos(), Mth.floor(), Mth.lerp(), Mth.sin()
- 引用位置:
-
- 引用位置:
返回值
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
AABB()
- 引用位置:
-
- 引用位置:
参数/构造调用/返回值 - 关联成员:
Vec3()
- 引用位置: