minecraft-src/net/minecraft/client/renderer/debug/OctreeDebugRenderer.java
2025-07-04 02:49:36 +03:00

72 lines
2.3 KiB
Java

package net.minecraft.client.renderer.debug;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.Octree;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.ShapeRenderer;
import net.minecraft.client.renderer.culling.Frustum;
import net.minecraft.util.Mth;
import net.minecraft.world.phys.AABB;
import org.apache.commons.lang3.mutable.MutableInt;
@Environment(EnvType.CLIENT)
public class OctreeDebugRenderer {
private final Minecraft minecraft;
public OctreeDebugRenderer(Minecraft minecraft) {
this.minecraft = minecraft;
}
public void render(PoseStack poseStack, Frustum frustum, MultiBufferSource bufferSource, double camX, double camY, double camZ) {
Octree octree = this.minecraft.levelRenderer.getSectionOcclusionGraph().getOctree();
MutableInt mutableInt = new MutableInt(0);
octree.visitNodes((node, bl, i, bl2) -> this.renderNode(node, poseStack, bufferSource, camX, camY, camZ, i, bl, mutableInt, bl2), frustum, 32);
}
private void renderNode(
Octree.Node node,
PoseStack poseStack,
MultiBufferSource bufferSource,
double camX,
double camY,
double camZ,
int recursionDepth,
boolean isLeafNode,
MutableInt nodesRendered,
boolean isNearby
) {
AABB aABB = node.getAABB();
double d = aABB.getXsize();
long l = Math.round(d / 16.0);
if (l == 1L) {
nodesRendered.add(1);
double e = aABB.getCenter().x;
double f = aABB.getCenter().y;
double g = aABB.getCenter().z;
int i = isNearby ? -16711936 : -1;
DebugRenderer.renderFloatingText(poseStack, bufferSource, String.valueOf(nodesRendered.getValue()), e, f, g, i, 0.3F);
}
VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderType.lines());
long m = l + 5L;
ShapeRenderer.renderLineBox(
poseStack,
vertexConsumer,
aABB.deflate(0.1 * recursionDepth).move(-camX, -camY, -camZ),
getColorComponent(m, 0.3F),
getColorComponent(m, 0.8F),
getColorComponent(m, 0.5F),
isLeafNode ? 0.4F : 1.0F
);
}
private static float getColorComponent(long value, float multiplier) {
float f = 0.1F;
return Mth.frac(multiplier * (float)value) * 0.9F + 0.1F;
}
}