PathfindingRenderer.java

net.minecraft.client.renderer.debug.PathfindingRenderer

信息

  • 全限定名:net.minecraft.client.renderer.debug.PathfindingRenderer
  • 类型:public class
  • 包:net.minecraft.client.renderer.debug
  • 源码路径:src/main/java/net/minecraft/client/renderer/debug/PathfindingRenderer.java
  • 起始行号:L21
  • 实现:DebugRenderer.SimpleDebugRenderer
  • 职责:

    TODO

字段/常量

  • MAX_RENDER_DIST

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

      TODO

  • MAX_TARGETING_DIST

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

      TODO

  • SHOW_ONLY_SELECTED

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

      TODO

  • SHOW_OPEN_CLOSED

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

      TODO

  • SHOW_OPEN_CLOSED_COST_MALUS

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

      TODO

  • SHOW_OPEN_CLOSED_NODE_TYPE_WITH_TEXT

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

      TODO

  • SHOW_OPEN_CLOSED_NODE_TYPE_WITH_BOX

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

      TODO

  • SHOW_GROUND_LABELS

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

      TODO

  • TEXT_SCALE

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

      TODO

内部类/嵌套类型

构造器

方法

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

public void emitGizmos(double camX, double camY, double camZ, DebugValueAccess debugValues, Frustum frustum, float partialTicks) @ L32

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

参数:

  • camX: double
  • camY: double
  • camZ: double
  • debugValues: DebugValueAccess
  • frustum: Frustum
  • partialTicks: float

说明:

TODO

private static void renderPath(double camX, double camY, double camZ, Path path, float maxNodeDistance) @ L37

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

参数:

  • camX: double
  • camY: double
  • camZ: double
  • path: Path
  • maxNodeDistance: float

说明:

TODO

public static void renderPath(Path path, float maxNodeDistance, boolean renderOpenAndClosedSets, boolean renderGroundLabels, double camX, double camY, double camZ) @ L41

  • 方法名:renderPath
  • 源码定位:L41
  • 返回类型:void
  • 修饰符:public static

参数:

  • path: Path
  • maxNodeDistance: float
  • renderOpenAndClosedSets: boolean
  • renderGroundLabels: boolean
  • camX: double
  • camY: double
  • camZ: double

说明:

TODO

public static void renderPathLine(Path path, double camX, double camY, double camZ) @ L124

  • 方法名:renderPathLine
  • 源码定位:L124
  • 返回类型:void
  • 修饰符:public static

参数:

  • path: Path
  • camX: double
  • camY: double
  • camZ: double

说明:

TODO

private static float distanceToCamera(BlockPos n, double camX, double camY, double camZ) @ L142

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

参数:

  • n: BlockPos
  • camX: double
  • camY: double
  • camZ: double

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class PathfindingRenderer implements DebugRenderer.SimpleDebugRenderer {
    private static final float MAX_RENDER_DIST = 80.0F;
    private static final int MAX_TARGETING_DIST = 8;
    private static final boolean SHOW_ONLY_SELECTED = false;
    private static final boolean SHOW_OPEN_CLOSED = true;
    private static final boolean SHOW_OPEN_CLOSED_COST_MALUS = false;
    private static final boolean SHOW_OPEN_CLOSED_NODE_TYPE_WITH_TEXT = false;
    private static final boolean SHOW_OPEN_CLOSED_NODE_TYPE_WITH_BOX = true;
    private static final boolean SHOW_GROUND_LABELS = true;
    private static final float TEXT_SCALE = 0.32F;
 
    @Override
    public void emitGizmos(double camX, double camY, double camZ, DebugValueAccess debugValues, Frustum frustum, float partialTicks) {
        debugValues.forEachEntity(DebugSubscriptions.ENTITY_PATHS, (entity, info) -> renderPath(camX, camY, camZ, info.path(), info.maxNodeDistance()));
    }
 
    private static void renderPath(double camX, double camY, double camZ, Path path, float maxNodeDistance) {
        renderPath(path, maxNodeDistance, true, true, camX, camY, camZ);
    }
 
    public static void renderPath(
        Path path, float maxNodeDistance, boolean renderOpenAndClosedSets, boolean renderGroundLabels, double camX, double camY, double camZ
    ) {
        renderPathLine(path, camX, camY, camZ);
        BlockPos pos = path.getTarget();
        if (distanceToCamera(pos, camX, camY, camZ) <= 80.0F) {
            Gizmos.cuboid(
                new AABB(pos.getX() + 0.25F, pos.getY() + 0.25F, pos.getZ() + 0.25, pos.getX() + 0.75F, pos.getY() + 0.75F, pos.getZ() + 0.75F),
                GizmoStyle.fill(ARGB.colorFromFloat(0.5F, 0.0F, 1.0F, 0.0F))
            );
 
            for (int i = 0; i < path.getNodeCount(); i++) {
                Node n = path.getNode(i);
                if (distanceToCamera(n.asBlockPos(), camX, camY, camZ) <= 80.0F) {
                    float r = i == path.getNextNodeIndex() ? 1.0F : 0.0F;
                    float b = i == path.getNextNodeIndex() ? 0.0F : 1.0F;
                    AABB aabb = new AABB(
                        n.x + 0.5F - maxNodeDistance,
                        n.y + 0.01F * i,
                        n.z + 0.5F - maxNodeDistance,
                        n.x + 0.5F + maxNodeDistance,
                        n.y + 0.25F + 0.01F * i,
                        n.z + 0.5F + maxNodeDistance
                    );
                    Gizmos.cuboid(aabb, GizmoStyle.fill(ARGB.colorFromFloat(0.5F, r, 0.0F, b)));
                }
            }
        }
 
        Path.DebugData debugData = path.debugData();
        if (renderOpenAndClosedSets && debugData != null) {
            for (Node node : debugData.closedSet()) {
                if (distanceToCamera(node.asBlockPos(), camX, camY, camZ) <= 80.0F) {
                    Gizmos.cuboid(
                        new AABB(
                            node.x + 0.5F - maxNodeDistance / 2.0F,
                            node.y + 0.01F,
                            node.z + 0.5F - maxNodeDistance / 2.0F,
                            node.x + 0.5F + maxNodeDistance / 2.0F,
                            node.y + 0.1,
                            node.z + 0.5F + maxNodeDistance / 2.0F
                        ),
                        GizmoStyle.fill(ARGB.colorFromFloat(0.5F, 1.0F, 0.8F, 0.8F))
                    );
                }
            }
 
            for (Node nodex : debugData.openSet()) {
                if (distanceToCamera(nodex.asBlockPos(), camX, camY, camZ) <= 80.0F) {
                    Gizmos.cuboid(
                        new AABB(
                            nodex.x + 0.5F - maxNodeDistance / 2.0F,
                            nodex.y + 0.01F,
                            nodex.z + 0.5F - maxNodeDistance / 2.0F,
                            nodex.x + 0.5F + maxNodeDistance / 2.0F,
                            nodex.y + 0.1,
                            nodex.z + 0.5F + maxNodeDistance / 2.0F
                        ),
                        GizmoStyle.fill(ARGB.colorFromFloat(0.5F, 0.8F, 1.0F, 1.0F))
                    );
                }
            }
        }
 
        if (renderGroundLabels) {
            for (int ix = 0; ix < path.getNodeCount(); ix++) {
                Node n = path.getNode(ix);
                if (distanceToCamera(n.asBlockPos(), camX, camY, camZ) <= 80.0F) {
                    Gizmos.billboardText(
                            String.valueOf(n.type), new Vec3(n.x + 0.5, n.y + 0.75, n.z + 0.5), TextGizmo.Style.whiteAndCentered().withScale(0.32F)
                        )
                        .setAlwaysOnTop();
                    Gizmos.billboardText(
                            String.format(Locale.ROOT, "%.2f", n.costMalus),
                            new Vec3(n.x + 0.5, n.y + 0.25, n.z + 0.5),
                            TextGizmo.Style.whiteAndCentered().withScale(0.32F)
                        )
                        .setAlwaysOnTop();
                }
            }
        }
    }
 
    public static void renderPathLine(Path path, double camX, double camY, double camZ) {
        if (path.getNodeCount() >= 2) {
            Vec3 last = path.getNode(0).asVec3();
 
            for (int i = 1; i < path.getNodeCount(); i++) {
                Node n = path.getNode(i);
                if (distanceToCamera(n.asBlockPos(), camX, camY, camZ) > 80.0F) {
                    last = n.asVec3();
                } else {
                    float hue = (float)i / path.getNodeCount() * 0.33F;
                    int color = ARGB.opaque(Mth.hsvToRgb(hue, 0.9F, 0.9F));
                    Gizmos.arrow(last.add(0.5, 0.5, 0.5), n.asVec3().add(0.5, 0.5, 0.5), color);
                    last = n.asVec3();
                }
            }
        }
    }
 
    private static float distanceToCamera(BlockPos n, double camX, double camY, double camZ) {
        return (float)(Math.abs(n.getX() - camX) + Math.abs(n.getY() - camY) + Math.abs(n.getZ() - camZ));
    }
}

引用的其他类

  • Frustum

    • 引用位置: 参数
  • DebugRenderer

    • 引用位置: 实现
  • BlockPos

    • 引用位置: 参数
  • GizmoStyle

    • 引用位置: 方法调用
    • 关联成员: GizmoStyle.fill()
  • Gizmos

    • 引用位置: 方法调用
    • 关联成员: Gizmos.arrow(), Gizmos.billboardText(), Gizmos.cuboid()
  • TextGizmo

    • 引用位置: 方法调用
    • 关联成员: TextGizmo.Style.whiteAndCentered()
  • ARGB

    • 引用位置: 方法调用
    • 关联成员: ARGB.colorFromFloat(), ARGB.opaque()
  • Mth

    • 引用位置: 方法调用
    • 关联成员: Mth.hsvToRgb()
  • DebugValueAccess

    • 引用位置: 参数
  • Path

    • 引用位置: 参数
  • AABB

    • 引用位置: 构造调用
    • 关联成员: AABB()
  • Vec3

    • 引用位置: 构造调用
    • 关联成员: Vec3()