From e9e1ddc280e5f6d1be15c7abec16025bdaae4d8e Mon Sep 17 00:00:00 2001 From: MrMangoHands Date: Sat, 13 Feb 2021 23:01:14 -0800 Subject: [PATCH] fix: Don't set the direction of diagonal fluid faces (#476) Prevents improper culling. Fixes #171 more thoroughly. --- .../render/chunk/data/ChunkRenderBounds.java | 13 ++++++------- .../client/render/pipeline/FluidRenderer.java | 17 ++++++++++------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/data/ChunkRenderBounds.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/data/ChunkRenderBounds.java index f5a8ddd3f9..9e933dfa96 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/data/ChunkRenderBounds.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/data/ChunkRenderBounds.java @@ -57,15 +57,14 @@ public ChunkRenderBounds build(ChunkSectionPos origin) { int z1 = origin.getMinZ() + leftBound(this.z); int z2 = origin.getMinZ() + rightBound(this.z); - // Expand the bounding box by 8 blocks (half a chunk) in order to deal with diagonal surfaces return new ChunkRenderBounds( - Math.max(x1, origin.getMinX()) - 8.0f, - Math.max(y1, origin.getMinY()) - 8.0f, - Math.max(z1, origin.getMinZ()) - 8.0f, + Math.max(x1, origin.getMinX()) - 0.5f, + Math.max(y1, origin.getMinY()) - 0.5f, + Math.max(z1, origin.getMinZ()) - 0.5f, - Math.min(x2, origin.getMaxX()) + 8.0f, - Math.min(y2, origin.getMaxY()) + 8.0f, - Math.min(z2, origin.getMaxZ()) + 8.0f + Math.min(x2, origin.getMaxX()) + 0.5f, + Math.min(y2, origin.getMaxY()) + 0.5f, + Math.min(z2, origin.getMaxZ()) + 0.5f ); } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/FluidRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/FluidRenderer.java index f8f476586e..fe108bf269 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/FluidRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/FluidRenderer.java @@ -152,11 +152,13 @@ public boolean render(BlockRenderView world, FluidState fluidState, BlockPos pos Vec3d velocity = fluidState.getVelocity(world, pos); Sprite sprite; + ModelQuadFacing facing; float u1, u2, u3, u4; float v1, v2, v3, v4; if (velocity.x == 0.0D && velocity.z == 0.0D) { sprite = sprites[0]; + facing = ModelQuadFacing.UP; u1 = sprite.getFrameU(0.0D); v1 = sprite.getFrameV(0.0D); u2 = u1; @@ -167,6 +169,7 @@ public boolean render(BlockRenderView world, FluidState fluidState, BlockPos pos v4 = v1; } else { sprite = sprites[1]; + facing = ModelQuadFacing.UNASSIGNED; float dir = (float) MathHelper.atan2(velocity.z, velocity.x) - (1.5707964f); float sin = MathHelper.sin(dir) * 0.25F; float cos = MathHelper.cos(dir) * 0.25F; @@ -203,7 +206,7 @@ public boolean render(BlockRenderView world, FluidState fluidState, BlockPos pos this.setVertex(quad, 3, 1.0F, h4, 0.0f, u4, v4); this.calculateQuadColors(quad, world, pos, lighter, Direction.UP, 1.0F, !lava); - this.flushQuad(buffers, quad, Direction.UP, false); + this.flushQuad(buffers, quad, facing, false); if (fluidState.method_15756(world, this.scratchPos.set(posX, posY + 1, posZ))) { this.setVertex(quad, 3, 0.0f, h1, 0.0f, u1, v1); @@ -211,7 +214,7 @@ public boolean render(BlockRenderView world, FluidState fluidState, BlockPos pos this.setVertex(quad, 1, 1.0F, h3, 1.0F, u3, v3); this.setVertex(quad, 0, 1.0F, h4, 0.0f, u4, v4); - this.flushQuad(buffers, quad, Direction.DOWN, true); + this.flushQuad(buffers, quad, ModelQuadFacing.DOWN, true); } rendered = true; @@ -232,7 +235,7 @@ public boolean render(BlockRenderView world, FluidState fluidState, BlockPos pos this.setVertex(quad, 3, 1.0F, yOffset, 1.0F, maxU, maxV); this.calculateQuadColors(quad, world, pos, lighter, Direction.DOWN, 1.0F, !lava); - this.flushQuad(buffers, quad, Direction.DOWN, false); + this.flushQuad(buffers, quad, ModelQuadFacing.DOWN, false); rendered = true; } @@ -332,7 +335,7 @@ public boolean render(BlockRenderView world, FluidState fluidState, BlockPos pos float br = dir.getAxis() == Direction.Axis.Z ? 0.8F : 0.6F; this.calculateQuadColors(quad, world, pos, lighter, dir, br, !lava); - this.flushQuad(buffers, quad, dir, false); + this.flushQuad(buffers, quad, ModelQuadFacing.fromDirection(dir), false); if (sprite != this.waterOverlaySprite) { this.setVertex(quad, 0, x1, c1, z1, u1, v1); @@ -340,7 +343,7 @@ public boolean render(BlockRenderView world, FluidState fluidState, BlockPos pos this.setVertex(quad, 2, x2, yOffset, z2, u2, v3); this.setVertex(quad, 3, x2, c2, z2, u2, v2); - this.flushQuad(buffers, quad, dir, true); + this.flushQuad(buffers, quad, ModelQuadFacing.fromDirection(dir), true); } rendered = true; @@ -365,7 +368,7 @@ private void calculateQuadColors(ModelQuadView quad, BlockRenderView world, Blo } } - private void flushQuad(ChunkModelBuffers buffers, ModelQuadView quad, Direction dir, boolean flip) { + private void flushQuad(ChunkModelBuffers buffers, ModelQuadView quad, ModelQuadFacing facing, boolean flip) { int vertexIdx, lightOrder; if (flip) { @@ -376,7 +379,7 @@ private void flushQuad(ChunkModelBuffers buffers, ModelQuadView quad, Direction lightOrder = 1; } - ModelVertexSink sink = buffers.getSink(ModelQuadFacing.fromDirection(dir)); + ModelVertexSink sink = buffers.getSink(facing); sink.ensureCapacity(4); for (int i = 0; i < 4; i++) {