72 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			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;
 | |
| 	}
 | |
| }
 |