From 50887f62f7918b524d5c54a83a5adc7633f6ced9 Mon Sep 17 00:00:00 2001 From: Mithi83 <28407460+Mithi83@users.noreply.github.com> Date: Mon, 24 Jun 2024 02:51:07 +0200 Subject: [PATCH] Fix Spatial Anchor overlay rendering (#7955) Fix #7949. I've split this into two separate commits because I'm not sure if the depth test behavior is a bug or intentional. To me it looks weird without depth test, but that's up to a reviewer to decide. The top picture has both patches, the bottom picture has only the camera rotation patch applied. ![Spartial Anchor overlay](https://github.com/AppliedEnergistics/Applied-Energistics-2/assets/28407460/7424525e-c68b-4907-8cc4-663e153325cf) --------- Co-authored-by: Sebastian Hartte --- .../annotation/InWorldAnnotationRenderer.java | 3 +- .../client/render/overlay/OverlayManager.java | 7 ++-- .../render/overlay/OverlayRenderType.java | 41 +++++++++++++------ .../render/overlay/OverlayRenderer.java | 11 +++-- 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/main/java/appeng/client/guidebook/scene/annotation/InWorldAnnotationRenderer.java b/src/main/java/appeng/client/guidebook/scene/annotation/InWorldAnnotationRenderer.java index 4d2d2904eab..2746c1e16b8 100644 --- a/src/main/java/appeng/client/guidebook/scene/annotation/InWorldAnnotationRenderer.java +++ b/src/main/java/appeng/client/guidebook/scene/annotation/InWorldAnnotationRenderer.java @@ -7,7 +7,6 @@ import com.mojang.blaze3d.vertex.VertexFormat; import org.joml.Vector3f; -import org.lwjgl.opengl.GL11; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; @@ -36,7 +35,7 @@ public final class InWorldAnnotationRenderer { .setShaderState(RenderType.RENDERTYPE_TRANSLUCENT_SHADER) .setTextureState(RenderStateShard.BLOCK_SHEET_MIPPED) .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) - .setDepthTestState(new RenderStateShard.DepthTestStateShard(">", GL11.GL_GREATER)) + .setDepthTestState(RenderStateShard.GREATER_DEPTH_TEST) .setWriteMaskState(RenderStateShard.COLOR_WRITE) .createCompositeState(false)); diff --git a/src/main/java/appeng/client/render/overlay/OverlayManager.java b/src/main/java/appeng/client/render/overlay/OverlayManager.java index c0d718d8f4a..9d89fccbb23 100644 --- a/src/main/java/appeng/client/render/overlay/OverlayManager.java +++ b/src/main/java/appeng/client/render/overlay/OverlayManager.java @@ -22,7 +22,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Objects; -import java.util.stream.Collectors; import com.mojang.blaze3d.vertex.PoseStack; @@ -60,16 +59,18 @@ public void renderWorldLastEvent(RenderLevelStageEvent event) { poseStack.pushPose(); Vec3 projectedView = minecraft.gameRenderer.getMainCamera().getPosition(); + poseStack.mulPose(minecraft.gameRenderer.getMainCamera().rotation().invert()); poseStack.translate(-projectedView.x, -projectedView.y, -projectedView.z); - for (OverlayRenderer handler : overlayHandlers.entrySet().stream() + for (var handler : overlayHandlers.entrySet().stream() .filter(e -> e.getKey().getLevel() == minecraft.level).map(Entry::getValue) - .collect(Collectors.toList())) { + .toList()) { handler.render(poseStack, buffer); } poseStack.popPose(); + buffer.endBatch(OverlayRenderType.getBlockHilightLineOccluded()); buffer.endBatch(OverlayRenderType.getBlockHilightFace()); buffer.endBatch(OverlayRenderType.getBlockHilightLine()); } diff --git a/src/main/java/appeng/client/render/overlay/OverlayRenderType.java b/src/main/java/appeng/client/render/overlay/OverlayRenderType.java index 6331b24bdda..b880dbdbcc0 100644 --- a/src/main/java/appeng/client/render/overlay/OverlayRenderType.java +++ b/src/main/java/appeng/client/render/overlay/OverlayRenderType.java @@ -18,6 +18,11 @@ package appeng.client.render.overlay; +import static net.minecraft.client.renderer.RenderStateShard.COLOR_WRITE; +import static net.minecraft.client.renderer.RenderStateShard.GREATER_DEPTH_TEST; +import static net.minecraft.client.renderer.RenderStateShard.LEQUAL_DEPTH_TEST; +import static net.minecraft.client.renderer.RenderStateShard.TRANSLUCENT_TRANSPARENCY; + import java.util.OptionalDouble; import com.mojang.blaze3d.vertex.DefaultVertexFormat; @@ -36,6 +41,7 @@ public class OverlayRenderType extends RenderType { private static RenderType BLOCK_HIGHLIGHT_FACE; private static RenderType BLOCK_HIGHLIGHT_LINE; + private static RenderType BLOCK_HIGHLIGHT_LINE_OCCLUDED; public OverlayRenderType(String nameIn, VertexFormat formatIn, VertexFormat.Mode mode, int bufferSizeIn, boolean useDelegateIn, boolean needsSortingIn, Runnable setupTaskIn, Runnable clearTaskIn) { @@ -51,7 +57,7 @@ public static RenderType getBlockHilightFace() { .setTransparencyState(TransparencyStateShard.CRUMBLING_TRANSPARENCY) .setTextureState(NO_TEXTURE) .setLightmapState(NO_LIGHTMAP) - .setDepthTestState(NO_DEPTH_TEST) + .setDepthTestState(LEQUAL_DEPTH_TEST) .setWriteMaskState(COLOR_WRITE) .setCullState(NO_CULL) .setShaderState(RenderStateShard.POSITION_COLOR_SHADER) @@ -64,21 +70,32 @@ public static RenderType getBlockHilightFace() { public static RenderType getBlockHilightLine() { if (BLOCK_HIGHLIGHT_LINE == null) { - BLOCK_HIGHLIGHT_LINE = create("block_hilight_line", - DefaultVertexFormat.POSITION_COLOR_NORMAL, VertexFormat.Mode.LINES, 65536, false, false, - CompositeState.builder().setLineState(LINE_3) - .setTransparencyState(TransparencyStateShard.GLINT_TRANSPARENCY) - .setTextureState(NO_TEXTURE) - .setDepthTestState(NO_DEPTH_TEST) - .setCullState(NO_CULL) - .setLightmapState(NO_LIGHTMAP) - .setWriteMaskState(COLOR_DEPTH_WRITE) - .setShaderState(RENDERTYPE_LINES_SHADER) - .createCompositeState(false)); + BLOCK_HIGHLIGHT_LINE = makeLineRenderType("block_hilight_line", false); } return BLOCK_HIGHLIGHT_LINE; } + public static RenderType getBlockHilightLineOccluded() { + if (BLOCK_HIGHLIGHT_LINE_OCCLUDED == null) { + BLOCK_HIGHLIGHT_LINE_OCCLUDED = makeLineRenderType("block_hilight_line_occluded", true); + } + return BLOCK_HIGHLIGHT_LINE_OCCLUDED; + } + + private static CompositeRenderType makeLineRenderType(String name, boolean occluded) { + return create(name, + DefaultVertexFormat.POSITION_COLOR_NORMAL, VertexFormat.Mode.LINES, 65536, false, false, + CompositeState.builder().setLineState(LINE_3) + .setTransparencyState(occluded ? TRANSLUCENT_TRANSPARENCY : ADDITIVE_TRANSPARENCY) + .setTextureState(NO_TEXTURE) + .setDepthTestState(occluded ? GREATER_DEPTH_TEST : LEQUAL_DEPTH_TEST) + .setCullState(NO_CULL) + .setLightmapState(NO_LIGHTMAP) + .setWriteMaskState(occluded ? COLOR_WRITE : COLOR_DEPTH_WRITE) + .setShaderState(RENDERTYPE_LINES_SHADER) + .createCompositeState(false)); + } + public static int[] decomposeColor(int color) { int[] res = new int[4]; res[0] = color >> 24 & 0xff; diff --git a/src/main/java/appeng/client/render/overlay/OverlayRenderer.java b/src/main/java/appeng/client/render/overlay/OverlayRenderer.java index eeff5823cfa..a36dc284678 100644 --- a/src/main/java/appeng/client/render/overlay/OverlayRenderer.java +++ b/src/main/java/appeng/client/render/overlay/OverlayRenderer.java @@ -41,15 +41,18 @@ public class OverlayRenderer { } public void render(PoseStack poseStack, MultiBufferSource buffer) { + RenderType typeLinesOccluded = OverlayRenderType.getBlockHilightLineOccluded(); + render(poseStack, buffer.getBuffer(typeLinesOccluded), true, 0x30ffffff); + RenderType typeFaces = OverlayRenderType.getBlockHilightFace(); - render(poseStack, buffer.getBuffer(typeFaces), false); + render(poseStack, buffer.getBuffer(typeFaces), false, this.source.getOverlayColor()); RenderType typeLines = OverlayRenderType.getBlockHilightLine(); - render(poseStack, buffer.getBuffer(typeLines), true); + render(poseStack, buffer.getBuffer(typeLines), true, this.source.getOverlayColor()); } - private void render(PoseStack poseStack, VertexConsumer builder, boolean renderLines) { - int[] cols = OverlayRenderType.decomposeColor(this.source.getOverlayColor()); + private void render(PoseStack poseStack, VertexConsumer builder, boolean renderLines, int color) { + int[] cols = OverlayRenderType.decomposeColor(color); for (ChunkPos pos : this.source.getOverlayChunks()) { poseStack.pushPose(); poseStack.translate(pos.getMinBlockX(), 0, pos.getMinBlockZ());