package net.xevianlight.aphelion.client; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.RenderLevelStageEvent; import net.xevianlight.aphelion.Aphelion; import org.joml.Matrix4f; import java.util.Collection; @EventBusSubscriber(modid = Aphelion.MOD_ID, value = Dist.CLIENT) public final class OxygenDebugRender { // Untextured translucent quads (POSITION_COLOR only) private static final RenderType OXYGEN_FILL = RenderType.create( "aphelion_oxygen_fill", DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.QUADS, 256, false, true, RenderType.CompositeState.builder() .setShaderState(RenderStateShard.POSITION_COLOR_SHADER) .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) .setCullState(RenderStateShard.NO_CULL) .setDepthTestState(RenderStateShard.LEQUAL_DEPTH_TEST) .setWriteMaskState(RenderStateShard.COLOR_DEPTH_WRITE) .createCompositeState(true) ); @SubscribeEvent public static void onRenderLevel(RenderLevelStageEvent event) { // One stage only (pick one that exists and looks good) if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) return; Minecraft mc = Minecraft.getInstance(); if (mc.level == null || mc.player == null) return; if (!mc.gui.getDebugOverlay().showDebugScreen()) return; PoseStack poseStack = event.getPoseStack(); var cam = mc.gameRenderer.getMainCamera(); var camPos = cam.getPosition(); poseStack.pushPose(); poseStack.translate(-camPos.x, -camPos.y, -camPos.z); MultiBufferSource.BufferSource bufferSource = mc.renderBuffers().bufferSource(); VertexConsumer vc = bufferSource.getBuffer(OXYGEN_FILL); DebugRenderUtils.drawBlockArea(poseStack, vc, ClientOxygenCache.OXYGEN); poseStack.popPose(); bufferSource.endBatch(OXYGEN_FILL); } }