From 4f65fd7d2bdfd79c79f63c5a1fd4500bb7575bb4 Mon Sep 17 00:00:00 2001 From: ishland Date: Sun, 1 Aug 2021 21:25:05 +0800 Subject: [PATCH] Rendering improvements Fixes https://github.com/irtimaled/BoundingBoxOutlineReloaded/issues/128 Fixes https://github.com/irtimaled/BoundingBoxOutlineReloaded/issues/127 --- .../bbor/client/providers/BeaconProvider.java | 3 +- .../client/renderers/AbstractRenderer.java | 62 +++++++++++++++---- .../bbor/client/renderers/BeaconRenderer.java | 4 +- .../client/renderers/BiomeBorderRenderer.java | 2 +- .../client/renderers/ConduitRenderer.java | 4 +- .../bbor/client/renderers/CuboidRenderer.java | 2 +- .../renderers/FlowerForestRenderer.java | 2 +- .../client/renderers/MobSpawnerRenderer.java | 4 +- .../bbor/client/renderers/RenderHelper.java | 1 + .../client/renderers/SlimeChunkRenderer.java | 4 +- .../renderers/SpawnableBlocksRenderer.java | 2 +- .../renderers/SpawningSphereRenderer.java | 4 +- .../client/renderers/WorldSpawnRenderer.java | 2 +- .../client/renderer/MixinWorldRenderer.java | 2 +- 14 files changed, 68 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/irtimaled/bbor/client/providers/BeaconProvider.java b/src/main/java/com/irtimaled/bbor/client/providers/BeaconProvider.java index 33b3a2d..ee6ca6a 100644 --- a/src/main/java/com/irtimaled/bbor/client/providers/BeaconProvider.java +++ b/src/main/java/com/irtimaled/bbor/client/providers/BeaconProvider.java @@ -6,6 +6,7 @@ import com.irtimaled.bbor.client.models.BoundingBoxBeacon; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.models.Coords; import com.irtimaled.bbor.common.models.DimensionId; +import com.irtimaled.bbor.mixin.access.IBeaconBlockEntity; import net.minecraft.block.entity.BeaconBlockEntity; public class BeaconProvider implements IBoundingBoxProvider { @@ -17,7 +18,7 @@ public class BeaconProvider implements IBoundingBoxProvider { @Override public Iterable get(DimensionId dimensionId) { return TileEntitiesHelper.map(BeaconBlockEntity.class, beacon -> { - int levels = beacon.getBeamSegments().size(); + int levels = ((IBeaconBlockEntity) beacon).getLevel(); Coords coords = new Coords(beacon.getPos()); return BoundingBoxBeacon.from(coords, levels); }); diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java b/src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java index 98e8a91..683c19a 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java @@ -30,6 +30,7 @@ public abstract class AbstractRenderer { public static final double PHI_SEGMENT = TAU / 90D; private static final double PI = TAU / 2D; public static final double THETA_SEGMENT = PHI_SEGMENT / 2D; + private static final float LINE_RADIUS = 0.0025f; private final VertexBuffer solidBox = new VertexBuffer(); private final VertexBuffer outlinedBox = new VertexBuffer(); @@ -42,47 +43,74 @@ public abstract class AbstractRenderer { public abstract void render(MatrixStack matrixStack, T boundingBox); - void renderCuboid(MatrixStack matrixStack, OffsetBox bb, Color color, boolean fillOnly) { + void renderCuboid(MatrixStack matrixStack, OffsetBox bb, Color color, boolean fillOnly, int fillAlpha) { OffsetBox nudge = bb.nudge(); - GL11.glEnable(GL11.GL_LINE_SMOOTH); GL11.glEnable(GL11.GL_CULL_FACE); RenderHelper.polygonModeFill(); matrixStack.push(); - RenderHelper.applyRegionalRenderOffset(matrixStack); - renderCuboid0(matrixStack, nudge, color, fillOnly); + renderCuboid0(matrixStack, nudge, color, fillOnly, fillAlpha); matrixStack.pop(); - GL11.glDisable(GL11.GL_LINE_SMOOTH); RenderSystem.setShaderColor(1, 1, 1, 1); } - private void renderCuboid0(MatrixStack stack, OffsetBox nudge, Color color, boolean fillOnly) { + private void renderCuboid0(MatrixStack stack, OffsetBox nudge, Color color, boolean fillOnly, int fillAlpha) { if (!RenderCulling.isVisibleCulling(nudge.toBox())) return; if (ConfigManager.invertBoxColorPlayerInside.get() && playerInsideBoundingBox(nudge)) { color = new Color(255 - color.getRed(), 255 - color.getGreen(), 255 - color.getBlue()); } + final MatrixStack.Entry lastStack = stack.peek(); stack.push(); int regionX = (((int) Camera.getX()) >> 9) << 9; int regionZ = (((int) Camera.getZ()) >> 9) << 9; + RenderHelper.applyRegionalRenderOffset(stack); RenderSystem.setShader(GameRenderer::getPositionShader); - stack.translate(nudge.getMin().getX() - regionX, nudge.getMin().getY(), nudge.getMin().getZ() - regionZ); - stack.scale((float) (nudge.getMax().getX() - nudge.getMin().getX()), - (float) (nudge.getMax().getY() - nudge.getMin().getY()), - (float) (nudge.getMax().getZ() - nudge.getMin().getZ())); + final double minX = nudge.getMin().getX(); + final double minY = nudge.getMin().getY(); + final double minZ = nudge.getMin().getZ(); + final double maxX = nudge.getMax().getX(); + final double maxY = nudge.getMax().getY(); + final double maxZ = nudge.getMax().getZ(); + stack.translate(minX - regionX, minY, minZ - regionZ); + stack.scale((float) (maxX - minX), + (float) (maxY - minY), + (float) (maxZ - minZ)); Matrix4f viewMatrix = stack.peek().getModel(); Matrix4f projMatrix = RenderSystem.getProjectionMatrix(); Shader shader = RenderSystem.getShader(); if (fillOnly || ConfigManager.fill.get()) { - RenderSystem.setShaderColor(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 30 / 255F); + RenderSystem.setShaderColor(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, fillAlpha / 255F); solidBox.setShader(viewMatrix, projMatrix, shader); } if (!fillOnly) { RenderSystem.setShaderColor(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 1F); - outlinedBox.setShader(viewMatrix, projMatrix, shader); +// outlinedBox.setShader(viewMatrix, projMatrix, shader); + final double minXL = minX - LINE_RADIUS; + final double minYL = minY - LINE_RADIUS; + final double minZL = minZ - LINE_RADIUS; + final double maxXL = maxX + LINE_RADIUS; + final double maxYL = maxY + LINE_RADIUS; + final double maxZL = maxZ + LINE_RADIUS; + stack.push(); + stack.peek().getModel().load(lastStack.getModel()); + stack.peek().getNormal().load(lastStack.getNormal()); + renderLine(stack, new OffsetPoint(minXL, minYL, minZL), new OffsetPoint(maxXL, minYL, minZL), color); + renderLine(stack, new OffsetPoint(maxXL, minYL, minZL), new OffsetPoint(maxXL, minYL, maxZL), color); + renderLine(stack, new OffsetPoint(maxXL, minYL, maxZL), new OffsetPoint(minXL, minYL, maxZL), color); + renderLine(stack, new OffsetPoint(minXL, minYL, maxZL), new OffsetPoint(minXL, minYL, minZL), color); + renderLine(stack, new OffsetPoint(minXL, minYL, minZL), new OffsetPoint(minXL, maxYL, minZL), color); + renderLine(stack, new OffsetPoint(maxXL, minYL, minZL), new OffsetPoint(maxXL, maxYL, minZL), color); + renderLine(stack, new OffsetPoint(maxXL, minYL, maxZL), new OffsetPoint(maxXL, maxYL, maxZL), color); + renderLine(stack, new OffsetPoint(minXL, minYL, maxZL), new OffsetPoint(minXL, maxYL, maxZL), color); + renderLine(stack, new OffsetPoint(minXL, maxYL, minZL), new OffsetPoint(maxXL, maxYL, minZL), color); + renderLine(stack, new OffsetPoint(maxXL, maxYL, minZL), new OffsetPoint(maxXL, maxYL, maxZL), color); + renderLine(stack, new OffsetPoint(maxXL, maxYL, maxZL), new OffsetPoint(minXL, maxYL, maxZL), color); + renderLine(stack, new OffsetPoint(minXL, maxYL, maxZL), new OffsetPoint(minXL, maxYL, minZL), color); + stack.pop(); } stack.pop(); @@ -95,12 +123,20 @@ public abstract class AbstractRenderer { } void renderLine(MatrixStack matrixStack, OffsetPoint startPoint, OffsetPoint endPoint, Color color) { + if ((startPoint.getY() == endPoint.getY() && startPoint.getZ() == endPoint.getZ()) || + (startPoint.getX() == endPoint.getX() && startPoint.getZ() == endPoint.getZ()) || + (startPoint.getX() == endPoint.getX() && startPoint.getY() == endPoint.getY())) { + renderCuboid(matrixStack, new OffsetBox(startPoint.offset(-LINE_RADIUS, -LINE_RADIUS, -LINE_RADIUS), endPoint.offset(LINE_RADIUS, LINE_RADIUS, LINE_RADIUS)), color, true, 255); + return; + } + if (!RenderCulling.isVisibleCulling(new OffsetBox(startPoint, endPoint).toBox())) return; // TODO better culling + matrixStack.push(); RenderHelper.applyRegionalRenderOffset(matrixStack); RenderSystem.setShader(GameRenderer::getPositionShader); - RenderSystem.setShaderColor(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 0.55f); + RenderSystem.setShaderColor(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 1F); int regionX = (((int) Camera.getX()) >> 9) * 512; int regionZ = (((int) Camera.getZ()) >> 9) * 512; diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/BeaconRenderer.java b/src/main/java/com/irtimaled/bbor/client/renderers/BeaconRenderer.java index e1ee127..53b886c 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/BeaconRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/BeaconRenderer.java @@ -12,9 +12,9 @@ public class BeaconRenderer extends AbstractRenderer { public void render(MatrixStack matrixStack, BoundingBoxBeacon boundingBox) { Coords coords = boundingBox.getCoords(); Color color = BoundingBoxTypeHelper.getColor(boundingBox.getType()); - renderCuboid(matrixStack, new OffsetBox(coords, coords), color, false); + renderCuboid(matrixStack, new OffsetBox(coords, coords), color, false, 30); if (boundingBox.getLevel() != 0) { - renderCuboid(matrixStack, new OffsetBox(boundingBox.getMinCoords(), boundingBox.getMaxCoords()), color, false); + renderCuboid(matrixStack, new OffsetBox(boundingBox.getMinCoords(), boundingBox.getMaxCoords()), color, false, 30); } } } diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/BiomeBorderRenderer.java b/src/main/java/com/irtimaled/bbor/client/renderers/BiomeBorderRenderer.java index c957690..fc50eab 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/BiomeBorderRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/BiomeBorderRenderer.java @@ -48,7 +48,7 @@ public class BiomeBorderRenderer extends AbstractRenderer { OffsetPoint center = new OffsetPoint(point); OffsetBox centerBox = new OffsetBox(center, center).grow(0.5, 0.5, 0.5); - renderCuboid(matrixStack, centerBox, color, false); + renderCuboid(matrixStack, centerBox, color, false, 30); if (level == 6 && ConfigManager.renderConduitMobHarmArea.get()) { renderCuboid(matrixStack, centerBox.grow(8, 8, 8), - ColorHelper.getColor(ConfigManager.colorConduitMobHarmArea), false); + ColorHelper.getColor(ConfigManager.colorConduitMobHarmArea), false, 30); } } } diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/CuboidRenderer.java b/src/main/java/com/irtimaled/bbor/client/renderers/CuboidRenderer.java index 094c63e..b538093 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/CuboidRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/CuboidRenderer.java @@ -8,6 +8,6 @@ public class CuboidRenderer extends AbstractRenderer { @Override public void render(MatrixStack matrixStack, BoundingBoxCuboid boundingBox) { OffsetBox bb = new OffsetBox(boundingBox.getMinCoords(), boundingBox.getMaxCoords()); - renderCuboid(matrixStack, bb, BoundingBoxTypeHelper.getColor(boundingBox.getType()), false); + renderCuboid(matrixStack, bb, BoundingBoxTypeHelper.getColor(boundingBox.getType()), false, 30); } } diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/FlowerForestRenderer.java b/src/main/java/com/irtimaled/bbor/client/renderers/FlowerForestRenderer.java index fd81328..81c3e77 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/FlowerForestRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/FlowerForestRenderer.java @@ -13,6 +13,6 @@ public class FlowerForestRenderer extends AbstractRenderer Coords coords = boundingBox.getCoords(); Color color = BoundingBoxTypeHelper.getColor(boundingBox.getType()); - renderCuboid(matrixStack, new OffsetBox(coords, coords), color, false); + renderCuboid(matrixStack, new OffsetBox(coords, coords), color, false, 30); if (ConfigManager.renderMobSpawnerActivationLines.get()) { renderActivationLine(matrixStack, new OffsetPoint(coords).offset(0.5, 0.5, 0.5)); @@ -24,7 +24,7 @@ public class MobSpawnerRenderer extends AbstractRenderer if (ConfigManager.renderMobSpawnerSpawnArea.get()) { OffsetBox bb = new OffsetBox(boundingBox.getMinCoords(), boundingBox.getMaxCoords()); - renderCuboid(matrixStack, bb, color, false); + renderCuboid(matrixStack, bb, color, false, 30); } } diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/RenderHelper.java b/src/main/java/com/irtimaled/bbor/client/renderers/RenderHelper.java index 8826c4b..17bddf7 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/RenderHelper.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/RenderHelper.java @@ -31,6 +31,7 @@ public class RenderHelper { } public static void afterRender() { + enableDepthTest(); RenderSystem.enableCull(); GL11.glDisable(GL11.GL_LINE_SMOOTH); RenderSystem.setShaderColor(1, 1, 1, 1); diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/SlimeChunkRenderer.java b/src/main/java/com/irtimaled/bbor/client/renderers/SlimeChunkRenderer.java index 49b3c3d..1b8e7f6 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/SlimeChunkRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/SlimeChunkRenderer.java @@ -13,14 +13,14 @@ public class SlimeChunkRenderer extends AbstractRenderer public void render(MatrixStack matrixStack, BoundingBoxSlimeChunk boundingBox) { OffsetBox bb = new OffsetBox(boundingBox.getMinCoords(), boundingBox.getMaxCoords()); Color color = BoundingBoxTypeHelper.getColor(boundingBox.getType()); - renderCuboid(matrixStack, bb, color, false); + renderCuboid(matrixStack, bb, color, false, 30); double maxY = Player.getMaxY(ConfigManager.slimeChunkMaxY.get()); double dY = maxY - 39; if (dY > 0) { OffsetPoint min = bb.getMin().offset(0, 38, 0); OffsetPoint max = bb.getMax().offset(0, dY, 0); - renderCuboid(matrixStack, new OffsetBox(min, max), color, false); + renderCuboid(matrixStack, new OffsetBox(min, max), color, false, 30); } } } diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/SpawnableBlocksRenderer.java b/src/main/java/com/irtimaled/bbor/client/renderers/SpawnableBlocksRenderer.java index f4ae570..83b33c2 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/SpawnableBlocksRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/SpawnableBlocksRenderer.java @@ -15,7 +15,7 @@ public class SpawnableBlocksRenderer extends AbstractRenderer double y = Player.getMaxY(ConfigManager.worldSpawnMaxY.get()); OffsetBox offsetBox = new OffsetBox(minCoords.getX(), y, minCoords.getZ(), maxCoords.getX(), y, maxCoords.getZ()); - renderCuboid(matrixStack, offsetBox.nudge(), BoundingBoxTypeHelper.getColor(boundingBox.getType()), false); + renderCuboid(matrixStack, offsetBox.nudge(), BoundingBoxTypeHelper.getColor(boundingBox.getType()), false, 30); } } diff --git a/src/main/java/com/irtimaled/bbor/mixin/client/renderer/MixinWorldRenderer.java b/src/main/java/com/irtimaled/bbor/mixin/client/renderer/MixinWorldRenderer.java index ca76e6e..fcaa9c4 100644 --- a/src/main/java/com/irtimaled/bbor/mixin/client/renderer/MixinWorldRenderer.java +++ b/src/main/java/com/irtimaled/bbor/mixin/client/renderer/MixinWorldRenderer.java @@ -26,7 +26,7 @@ public class MixinWorldRenderer { @Shadow private Frustum frustum; - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/RenderLayer;getWaterMask()Lnet/minecraft/client/render/RenderLayer;", shift = At.Shift.BEFORE)) + @Inject(method = "render", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = "ldc=string", shift = At.Shift.BEFORE)) private void onRender(MatrixStack matrixStack, float partialTicks, long ignored_2, boolean ignored_3, Camera ignored_4, GameRenderer ignored_5, LightmapTextureManager ignored_6, Matrix4f ignored_7, CallbackInfo ci) { Preconditions.checkNotNull(this.client.player); RenderCulling.setFrustum(frustum); -- 2.44.0