Skip to content

Commit

Permalink
Fix Spatial Anchor overlay rendering (#7955)
Browse files Browse the repository at this point in the history
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 <shartte@users.noreply.github.com>
  • Loading branch information
Mithi83 and shartte committed Jun 24, 2024
1 parent 71bcd1d commit 50887f6
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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());
}
Expand Down
41 changes: 29 additions & 12 deletions src/main/java/appeng/client/render/overlay/OverlayRenderType.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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) {
Expand All @@ -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)
Expand All @@ -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;
Expand Down
11 changes: 7 additions & 4 deletions src/main/java/appeng/client/render/overlay/OverlayRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down

0 comments on commit 50887f6

Please sign in to comment.