ChunkCullingDebugRenderer.java

net.minecraft.client.renderer.debug.ChunkCullingDebugRenderer

信息

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

    TODO

字段/常量

  • DIRECTIONS

    • 类型: Direction[]
    • 修饰符: public static final
    • 源码定位: L23
    • 说明:

      TODO

  • minecraft

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

      TODO

内部类/嵌套类型

构造器

public ChunkCullingDebugRenderer(Minecraft minecraft) @ L26

  • 构造器名:ChunkCullingDebugRenderer
  • 源码定位:L26
  • 修饰符:public

参数:

  • minecraft: Minecraft

说明:

TODO

方法

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

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

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

参数:

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

说明:

TODO

private void addFrustumLine(Vec3 offset, Vector4f a, Vector4f b) @ L115

  • 方法名:addFrustumLine
  • 源码定位:L115
  • 返回类型:void
  • 修饰符:private

参数:

  • offset: Vec3
  • a: Vector4f
  • b: Vector4f

说明:

TODO

private void addFrustumQuad(Vec3 offset, Vector4f[] frustumPoints, int i0, int i1, int i2, int i3, int r, int g, int b) @ L119

  • 方法名:addFrustumQuad
  • 源码定位:L119
  • 返回类型:void
  • 修饰符:private

参数:

  • offset: Vec3
  • frustumPoints: Vector4f[]
  • i0: int
  • i1: int
  • i2: int
  • i3: int
  • r: int
  • g: int
  • b: int

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class ChunkCullingDebugRenderer implements DebugRenderer.SimpleDebugRenderer {
    public static final Direction[] DIRECTIONS = Direction.values();
    private final Minecraft minecraft;
 
    public ChunkCullingDebugRenderer(Minecraft minecraft) {
        this.minecraft = minecraft;
    }
 
    @Override
    public void emitGizmos(double camX, double camY, double camZ, DebugValueAccess debugValues, Frustum frustum, float partialTicks) {
        LevelRenderer levelRenderer = this.minecraft.levelRenderer;
        boolean sectionPath = this.minecraft.debugEntries.isCurrentlyEnabled(DebugScreenEntries.CHUNK_SECTION_PATHS);
        boolean sectionVisibility = this.minecraft.debugEntries.isCurrentlyEnabled(DebugScreenEntries.CHUNK_SECTION_VISIBILITY);
        if (sectionPath || sectionVisibility) {
            SectionOcclusionGraph sectionOcclusionGraph = levelRenderer.getSectionOcclusionGraph();
 
            for (SectionRenderDispatcher.RenderSection section : levelRenderer.getVisibleSections()) {
                SectionOcclusionGraph.Node node = sectionOcclusionGraph.getNode(section);
                if (node != null) {
                    BlockPos renderOffset = section.getRenderOrigin();
                    if (sectionPath) {
                        int color = node.step == 0 ? 0 : Mth.hsvToRgb(node.step / 50.0F, 0.9F, 0.9F);
 
                        for (int i = 0; i < DIRECTIONS.length; i++) {
                            if (node.hasSourceDirection(i)) {
                                Direction direction = DIRECTIONS[i];
                                Gizmos.line(
                                    Vec3.atLowerCornerWithOffset(renderOffset, 8.0, 8.0, 8.0),
                                    Vec3.atLowerCornerWithOffset(
                                        renderOffset, 8 - 16 * direction.getStepX(), 8 - 16 * direction.getStepY(), 8 - 16 * direction.getStepZ()
                                    ),
                                    ARGB.opaque(color)
                                );
                            }
                        }
                    }
 
                    if (sectionVisibility && section.getSectionMesh().hasRenderableLayers()) {
                        int c = 0;
 
                        for (Direction direction1 : DIRECTIONS) {
                            for (Direction direction2 : DIRECTIONS) {
                                boolean b = section.getSectionMesh().facesCanSeeEachother(direction1, direction2);
                                if (!b) {
                                    c++;
                                    Gizmos.line(
                                        Vec3.atLowerCornerWithOffset(
                                            renderOffset, 8 + 8 * direction1.getStepX(), 8 + 8 * direction1.getStepY(), 8 + 8 * direction1.getStepZ()
                                        ),
                                        Vec3.atLowerCornerWithOffset(
                                            renderOffset, 8 + 8 * direction2.getStepX(), 8 + 8 * direction2.getStepY(), 8 + 8 * direction2.getStepZ()
                                        ),
                                        ARGB.color(255, 255, 0, 0)
                                    );
                                }
                            }
                        }
 
                        if (c > 0) {
                            float delta = 0.5F;
                            float a = 0.2F;
                            Gizmos.cuboid(section.getBoundingBox().deflate(0.5), GizmoStyle.fill(ARGB.colorFromFloat(0.2F, 0.9F, 0.9F, 0.0F)));
                        }
                    }
                }
            }
        }
 
        Frustum capturedFrustum = this.minecraft.gameRenderer.getMainCamera().getCapturedFrustum();
        if (capturedFrustum != null) {
            Vec3 offset = new Vec3(capturedFrustum.getCamX(), capturedFrustum.getCamY(), capturedFrustum.getCamZ());
            Vector4f[] frustumPoints = capturedFrustum.getFrustumPoints();
            this.addFrustumQuad(offset, frustumPoints, 0, 1, 2, 3, 0, 1, 1);
            this.addFrustumQuad(offset, frustumPoints, 4, 5, 6, 7, 1, 0, 0);
            this.addFrustumQuad(offset, frustumPoints, 0, 1, 5, 4, 1, 1, 0);
            this.addFrustumQuad(offset, frustumPoints, 2, 3, 7, 6, 0, 0, 1);
            this.addFrustumQuad(offset, frustumPoints, 0, 4, 7, 3, 0, 1, 0);
            this.addFrustumQuad(offset, frustumPoints, 1, 5, 6, 2, 1, 0, 1);
            this.addFrustumLine(offset, frustumPoints[0], frustumPoints[1]);
            this.addFrustumLine(offset, frustumPoints[1], frustumPoints[2]);
            this.addFrustumLine(offset, frustumPoints[2], frustumPoints[3]);
            this.addFrustumLine(offset, frustumPoints[3], frustumPoints[0]);
            this.addFrustumLine(offset, frustumPoints[4], frustumPoints[5]);
            this.addFrustumLine(offset, frustumPoints[5], frustumPoints[6]);
            this.addFrustumLine(offset, frustumPoints[6], frustumPoints[7]);
            this.addFrustumLine(offset, frustumPoints[7], frustumPoints[4]);
            this.addFrustumLine(offset, frustumPoints[0], frustumPoints[4]);
            this.addFrustumLine(offset, frustumPoints[1], frustumPoints[5]);
            this.addFrustumLine(offset, frustumPoints[2], frustumPoints[6]);
            this.addFrustumLine(offset, frustumPoints[3], frustumPoints[7]);
        }
    }
 
    private void addFrustumLine(Vec3 offset, Vector4f a, Vector4f b) {
        Gizmos.line(new Vec3(offset.x + a.x, offset.y + a.y, offset.z + a.z), new Vec3(offset.x + b.x, offset.y + b.y, offset.z + b.z), -16777216);
    }
 
    private void addFrustumQuad(Vec3 offset, Vector4f[] frustumPoints, int i0, int i1, int i2, int i3, int r, int g, int b) {
        float a = 0.25F;
        Gizmos.rect(
            new Vec3(frustumPoints[i0].x(), frustumPoints[i0].y(), frustumPoints[i0].z()).add(offset),
            new Vec3(frustumPoints[i1].x(), frustumPoints[i1].y(), frustumPoints[i1].z()).add(offset),
            new Vec3(frustumPoints[i2].x(), frustumPoints[i2].y(), frustumPoints[i2].z()).add(offset),
            new Vec3(frustumPoints[i3].x(), frustumPoints[i3].y(), frustumPoints[i3].z()).add(offset),
            GizmoStyle.fill(ARGB.colorFromFloat(0.25F, r, g, b))
        );
    }
}

引用的其他类

  • Minecraft

    • 引用位置: 参数/字段
  • Frustum

    • 引用位置: 参数
  • DebugRenderer

    • 引用位置: 实现
  • Direction

    • 引用位置: 字段/方法调用
    • 关联成员: Direction.values()
  • GizmoStyle

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

    • 引用位置: 方法调用
    • 关联成员: Gizmos.cuboid(), Gizmos.line(), Gizmos.rect()
  • ARGB

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

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

    • 引用位置: 参数
  • Vec3

    • 引用位置: 参数/方法调用/构造调用
    • 关联成员: Vec3(), Vec3.atLowerCornerWithOffset()