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);
    }
}

引用的其他类