FishingHookRenderer.java

net.minecraft.client.renderer.entity.FishingHookRenderer

信息

  • 全限定名:net.minecraft.client.renderer.entity.FishingHookRenderer
  • 类型:public class
  • 包:net.minecraft.client.renderer.entity
  • 源码路径:src/main/java/net/minecraft/client/renderer/entity/FishingHookRenderer.java
  • 起始行号:L24
  • 继承:EntityRenderer<FishingHook,FishingHookRenderState>
  • 职责:

    TODO

字段/常量

  • TEXTURE_LOCATION

    • 类型: Identifier
    • 修饰符: private static final
    • 源码定位: L25
    • 说明:

      TODO

  • RENDER_TYPE

    • 类型: RenderType
    • 修饰符: private static final
    • 源码定位: L26
    • 说明:

      TODO

  • VIEW_BOBBING_SCALE

    • 类型: double
    • 修饰符: private static final
    • 源码定位: L27
    • 说明:

      TODO

内部类/嵌套类型

构造器

public FishingHookRenderer(EntityRendererProvider.Context context) @ L29

  • 构造器名:FishingHookRenderer
  • 源码定位:L29
  • 修饰符:public

参数:

  • context: EntityRendererProvider.Context

说明:

TODO

方法

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

public boolean shouldRender(FishingHook entity, Frustum culler, double camX, double camY, double camZ) @ L33

  • 方法名:shouldRender
  • 源码定位:L33
  • 返回类型:boolean
  • 修饰符:public

参数:

  • entity: FishingHook
  • culler: Frustum
  • camX: double
  • camY: double
  • camZ: double

说明:

TODO

public void submit(FishingHookRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) @ L37

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

参数:

  • state: FishingHookRenderState
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • camera: CameraRenderState

说明:

TODO

public static HumanoidArm getHoldingArm(Player owner) @ L67

  • 方法名:getHoldingArm
  • 源码定位:L67
  • 返回类型:HumanoidArm
  • 修饰符:public static

参数:

  • owner: Player

说明:

TODO

private Vec3 getPlayerHandPos(Player owner, float swing, float partialTicks) @ L71

  • 方法名:getPlayerHandPos
  • 源码定位:L71
  • 返回类型:Vec3
  • 修饰符:private

参数:

  • owner: Player
  • swing: float
  • partialTicks: float

说明:

TODO

private static float fraction(int i, int steps) @ L97

  • 方法名:fraction
  • 源码定位:L97
  • 返回类型:float
  • 修饰符:private static

参数:

  • i: int
  • steps: int

说明:

TODO

private static void vertex(VertexConsumer builder, PoseStack.Pose pose, int lightCoords, float x, int y, int u, int v) @ L101

  • 方法名:vertex
  • 源码定位:L101
  • 返回类型:void
  • 修饰符:private static

参数:

  • builder: VertexConsumer
  • pose: PoseStack.Pose
  • lightCoords: int
  • x: float
  • y: int
  • u: int
  • v: int

说明:

TODO

private static void stringVertex(float xa, float ya, float za, VertexConsumer stringBuffer, PoseStack.Pose stringPose, float aa, float nexta, float width) @ L110

  • 方法名:stringVertex
  • 源码定位:L110
  • 返回类型:void
  • 修饰符:private static

参数:

  • xa: float
  • ya: float
  • za: float
  • stringBuffer: VertexConsumer
  • stringPose: PoseStack.Pose
  • aa: float
  • nexta: float
  • width: float

说明:

TODO

public FishingHookRenderState createRenderState() @ L124

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

参数:

说明:

TODO

public void extractRenderState(FishingHook entity, FishingHookRenderState state, float partialTicks) @ L128

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

参数:

  • entity: FishingHook
  • state: FishingHookRenderState
  • partialTicks: float

说明:

TODO

protected boolean affectedByCulling(FishingHook entity) @ L142

  • 方法名:affectedByCulling
  • 源码定位:L142
  • 返回类型:boolean
  • 修饰符:protected

参数:

  • entity: FishingHook

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class FishingHookRenderer extends EntityRenderer<FishingHook, FishingHookRenderState> {
    private static final Identifier TEXTURE_LOCATION = Identifier.withDefaultNamespace("textures/entity/fishing/fishing_hook.png");
    private static final RenderType RENDER_TYPE = RenderTypes.entityCutoutCull(TEXTURE_LOCATION);
    private static final double VIEW_BOBBING_SCALE = 960.0;
 
    public FishingHookRenderer(EntityRendererProvider.Context context) {
        super(context);
    }
 
    public boolean shouldRender(FishingHook entity, Frustum culler, double camX, double camY, double camZ) {
        return super.shouldRender(entity, culler, camX, camY, camZ) && entity.getPlayerOwner() != null;
    }
 
    public void submit(FishingHookRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) {
        poseStack.pushPose();
        poseStack.pushPose();
        poseStack.scale(0.5F, 0.5F, 0.5F);
        poseStack.mulPose(camera.orientation);
        submitNodeCollector.submitCustomGeometry(poseStack, RENDER_TYPE, (pose, buffer) -> {
            vertex(buffer, pose, state.lightCoords, 0.0F, 0, 0, 1);
            vertex(buffer, pose, state.lightCoords, 1.0F, 0, 1, 1);
            vertex(buffer, pose, state.lightCoords, 1.0F, 1, 1, 0);
            vertex(buffer, pose, state.lightCoords, 0.0F, 1, 0, 0);
        });
        poseStack.popPose();
        float xa = (float)state.lineOriginOffset.x;
        float ya = (float)state.lineOriginOffset.y;
        float za = (float)state.lineOriginOffset.z;
        float width = Minecraft.getInstance().gameRenderer.getGameRenderState().windowRenderState.appropriateLineWidth;
        submitNodeCollector.submitCustomGeometry(poseStack, RenderTypes.lines(), (pose, buffer) -> {
            int steps = 16;
 
            for (int i = 0; i < 16; i++) {
                float a0 = fraction(i, 16);
                float a1 = fraction(i + 1, 16);
                stringVertex(xa, ya, za, buffer, pose, a0, a1, width);
                stringVertex(xa, ya, za, buffer, pose, a1, a0, width);
            }
        });
        poseStack.popPose();
        super.submit(state, poseStack, submitNodeCollector, camera);
    }
 
    public static HumanoidArm getHoldingArm(Player owner) {
        return owner.getMainHandItem().getItem() instanceof FishingRodItem ? owner.getMainArm() : owner.getMainArm().getOpposite();
    }
 
    private Vec3 getPlayerHandPos(Player owner, float swing, float partialTicks) {
        int invert = getHoldingArm(owner) == HumanoidArm.RIGHT ? 1 : -1;
        if (this.entityRenderDispatcher.options.getCameraType().isFirstPerson() && owner == Minecraft.getInstance().player) {
            float fov = this.entityRenderDispatcher.options.fov().get().intValue();
            double viewBobbingScale = 960.0 / fov;
            Vec3 viewVec = this.entityRenderDispatcher
                .camera
                .getNearPlane(fov)
                .getPointOnPlane(invert * 0.525F, -0.1F)
                .scale(viewBobbingScale)
                .yRot(swing * 0.5F)
                .xRot(-swing * 0.7F);
            return owner.getEyePosition(partialTicks).add(viewVec);
        } else {
            float ownerYRot = Mth.lerp(partialTicks, owner.yBodyRotO, owner.yBodyRot) * (float) (Math.PI / 180.0);
            double sin = Mth.sin(ownerYRot);
            double cos = Mth.cos(ownerYRot);
            float playerScale = owner.getScale();
            double rightOffset = invert * 0.35 * playerScale;
            double forwardOffset = 0.8 * playerScale;
            float yOffset = owner.isCrouching() ? -0.1875F : 0.0F;
            return owner.getEyePosition(partialTicks)
                .add(-cos * rightOffset - sin * forwardOffset, yOffset - 0.45 * playerScale, -sin * rightOffset + cos * forwardOffset);
        }
    }
 
    private static float fraction(int i, int steps) {
        return (float)i / steps;
    }
 
    private static void vertex(VertexConsumer builder, PoseStack.Pose pose, int lightCoords, float x, int y, int u, int v) {
        builder.addVertex(pose, x - 0.5F, y - 0.5F, 0.0F)
            .setColor(-1)
            .setUv(u, v)
            .setOverlay(OverlayTexture.NO_OVERLAY)
            .setLight(lightCoords)
            .setNormal(pose, 0.0F, 1.0F, 0.0F);
    }
 
    private static void stringVertex(float xa, float ya, float za, VertexConsumer stringBuffer, PoseStack.Pose stringPose, float aa, float nexta, float width) {
        float x = xa * aa;
        float y = ya * (aa * aa + aa) * 0.5F + 0.25F;
        float z = za * aa;
        float nx = xa * nexta - x;
        float ny = ya * (nexta * nexta + nexta) * 0.5F + 0.25F - y;
        float nz = za * nexta - z;
        float length = Mth.sqrt(nx * nx + ny * ny + nz * nz);
        nx /= length;
        ny /= length;
        nz /= length;
        stringBuffer.addVertex(stringPose, x, y, z).setColor(-16777216).setNormal(stringPose, nx, ny, nz).setLineWidth(width);
    }
 
    public FishingHookRenderState createRenderState() {
        return new FishingHookRenderState();
    }
 
    public void extractRenderState(FishingHook entity, FishingHookRenderState state, float partialTicks) {
        super.extractRenderState(entity, state, partialTicks);
        Player owner = entity.getPlayerOwner();
        if (owner == null) {
            state.lineOriginOffset = Vec3.ZERO;
        } else {
            float swing = owner.getAttackAnim(partialTicks);
            float swing2 = Mth.sin(Mth.sqrt(swing) * (float) Math.PI);
            Vec3 playerPos = this.getPlayerHandPos(owner, swing2, partialTicks);
            Vec3 hookPos = entity.getPosition(partialTicks).add(0.0, 0.25, 0.0);
            state.lineOriginOffset = playerPos.subtract(hookPos);
        }
    }
 
    protected boolean affectedByCulling(FishingHook entity) {
        return false;
    }
}

引用的其他类