Skip to content

Commit f71e077

Browse files
NotStirredleMaik
authored andcommitted
Fix fluids shape on octree edge
1 parent c4b66a6 commit f71e077

File tree

2 files changed

+36
-24
lines changed

2 files changed

+36
-24
lines changed

chunky/src/java/se/llbit/chunky/renderer/scene/OctreeFinalizer.java

+35-23
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import se.llbit.math.Octree;
2525
import se.llbit.math.Vector3i;
2626

27+
import java.util.Set;
28+
2729
/**
2830
* Processes the Octree after it has been loaded and updates block states for blocks that depend on
2931
* neighbor blocks. Octree finalization is be done after all chunks have been loaded because before
@@ -41,7 +43,7 @@ public class OctreeFinalizer {
4143
* @param cp Position of the chunk to finalize
4244
*/
4345
public static void finalizeChunk(Octree worldTree, Octree waterTree, BlockPalette palette,
44-
Vector3i origin, ChunkPosition cp, int yMin, int yMax) {
46+
Set<ChunkPosition> loadedChunks, Vector3i origin, ChunkPosition cp, int yMin, int yMax) {
4547
for (int cy = yMin; cy < yMax; ++cy) {
4648
for (int cz = 0; cz < 16; ++cz) {
4749
int z = cz + cp.z * 16 - origin.z;
@@ -50,7 +52,7 @@ public static void finalizeChunk(Octree worldTree, Octree waterTree, BlockPalett
5052
// process blocks that are at the edge of the chunk, the other should have be taken care of during the loading
5153
if (cy == yMin || cy == yMax - 1 || cz == 0 || cz == 15 || cx == 0 || cx == 15) {
5254
hideBlocks(worldTree, palette, x, cy, z, yMin, yMax, origin);
53-
processBlock(worldTree, waterTree, palette, x, cy, z, origin);
55+
processBlock(worldTree, waterTree, palette, loadedChunks, x, cy, z, origin);
5456
}
5557
}
5658
}
@@ -75,8 +77,8 @@ private static void hideBlocks(Octree worldTree, BlockPalette palette, int x,
7577
}
7678
}
7779

78-
private static void processBlock(Octree worldTree, Octree waterTree, BlockPalette palette, int x,
79-
int cy, int z, Vector3i origin) {
80+
private static void processBlock(Octree worldTree, Octree waterTree, BlockPalette palette,
81+
Set<ChunkPosition> loadedChunks, int x, int cy, int z, Vector3i origin) {
8082
int y = cy - origin.y;
8183
Material mat = worldTree.getMaterial(x, y, z, palette);
8284
Material wmat = waterTree.getMaterial(x, y, z, palette);
@@ -91,32 +93,32 @@ private static void processBlock(Octree worldTree, Octree waterTree, BlockPalett
9193
int corner2 = level0;
9294
int corner3 = level0;
9395

94-
int level = waterLevelAt(worldTree, waterTree, palette, x - 1, y, z, level0);
96+
int level = waterLevelAt(worldTree, waterTree, palette, loadedChunks, x - 1, y, z, level0);
9597
corner3 += level;
9698
corner0 += level;
9799

98-
level = waterLevelAt(worldTree, waterTree, palette, x - 1, y, z + 1, level0);
100+
level = waterLevelAt(worldTree, waterTree, palette, loadedChunks, x - 1, y, z + 1, level0);
99101
corner0 += level;
100102

101-
level = waterLevelAt(worldTree, waterTree, palette, x, y, z + 1, level0);
103+
level = waterLevelAt(worldTree, waterTree, palette, loadedChunks, x, y, z + 1, level0);
102104
corner0 += level;
103105
corner1 += level;
104106

105-
level = waterLevelAt(worldTree, waterTree, palette, x + 1, y, z + 1, level0);
107+
level = waterLevelAt(worldTree, waterTree, palette, loadedChunks, x + 1, y, z + 1, level0);
106108
corner1 += level;
107109

108-
level = waterLevelAt(worldTree, waterTree, palette, x + 1, y, z, level0);
110+
level = waterLevelAt(worldTree, waterTree, palette, loadedChunks, x + 1, y, z, level0);
109111
corner1 += level;
110112
corner2 += level;
111113

112-
level = waterLevelAt(worldTree, waterTree, palette, x + 1, y, z - 1, level0);
114+
level = waterLevelAt(worldTree, waterTree, palette, loadedChunks, x + 1, y, z - 1, level0);
113115
corner2 += level;
114116

115-
level = waterLevelAt(worldTree, waterTree, palette, x, y, z - 1, level0);
117+
level = waterLevelAt(worldTree, waterTree, palette, loadedChunks, x, y, z - 1, level0);
116118
corner2 += level;
117119
corner3 += level;
118120

119-
level = waterLevelAt(worldTree, waterTree, palette, x - 1, y, z - 1, level0);
121+
level = waterLevelAt(worldTree, waterTree, palette, loadedChunks, x - 1, y, z - 1, level0);
120122
corner3 += level;
121123

122124
corner0 = Math.min(7, 8 - (corner0 / 4));
@@ -142,32 +144,32 @@ private static void processBlock(Octree worldTree, Octree waterTree, BlockPalett
142144
int corner2 = level0;
143145
int corner3 = level0;
144146

145-
int level = lavaLevelAt(worldTree, palette, x - 1, y, z, level0);
147+
int level = lavaLevelAt(worldTree, palette, loadedChunks, x - 1, y, z, level0);
146148
corner3 += level;
147149
corner0 += level;
148150

149-
level = lavaLevelAt(worldTree, palette, x - 1, y, z + 1, level0);
151+
level = lavaLevelAt(worldTree, palette, loadedChunks, x - 1, y, z + 1, level0);
150152
corner0 += level;
151153

152-
level = lavaLevelAt(worldTree, palette, x, y, z + 1, level0);
154+
level = lavaLevelAt(worldTree, palette, loadedChunks, x, y, z + 1, level0);
153155
corner0 += level;
154156
corner1 += level;
155157

156-
level = lavaLevelAt(worldTree, palette, x + 1, y, z + 1, level0);
158+
level = lavaLevelAt(worldTree, palette, loadedChunks, x + 1, y, z + 1, level0);
157159
corner1 += level;
158160

159-
level = lavaLevelAt(worldTree, palette, x + 1, y, z, level0);
161+
level = lavaLevelAt(worldTree, palette, loadedChunks, x + 1, y, z, level0);
160162
corner1 += level;
161163
corner2 += level;
162164

163-
level = lavaLevelAt(worldTree, palette, x + 1, y, z - 1, level0);
165+
level = lavaLevelAt(worldTree, palette, loadedChunks, x + 1, y, z - 1, level0);
164166
corner2 += level;
165167

166-
level = lavaLevelAt(worldTree, palette, x, y, z - 1, level0);
168+
level = lavaLevelAt(worldTree, palette, loadedChunks, x, y, z - 1, level0);
167169
corner2 += level;
168170
corner3 += level;
169171

170-
level = lavaLevelAt(worldTree, palette, x - 1, y, z - 1, level0);
172+
level = lavaLevelAt(worldTree, palette, loadedChunks, x - 1, y, z - 1, level0);
171173
corner3 += level;
172174

173175
corner0 = Math.min(7, 8 - (corner0 / 4));
@@ -185,8 +187,13 @@ private static void processBlock(Octree worldTree, Octree waterTree, BlockPalett
185187
}
186188
}
187189

188-
private static int waterLevelAt(Octree worldTree, Octree waterTree,
189-
BlockPalette palette, int x, int cy, int z, int baseLevel) {
190+
private static int waterLevelAt(Octree worldTree, Octree waterTree, BlockPalette palette,
191+
Set<ChunkPosition> loadedChunks, int x, int cy, int z, int baseLevel) {
192+
// If the position isn't in a loaded chunk, return the baseLevel to make the edge-of-world water flat
193+
if (!loadedChunks.contains(new ChunkPosition(x >> 4, z >> 4))) {
194+
return baseLevel;
195+
}
196+
190197
Material corner = waterTree.getMaterial(x, cy, z, palette);
191198
if (corner instanceof Water) {
192199
Material above = waterTree.getMaterial(x, cy + 1, z, palette);
@@ -201,7 +208,12 @@ private static int waterLevelAt(Octree worldTree, Octree waterTree,
201208
}
202209

203210
private static int lavaLevelAt(Octree octree, BlockPalette palette,
204-
int x, int cy, int z, int baseLevel) {
211+
Set<ChunkPosition> loadedChunks, int x, int cy, int z, int baseLevel) {
212+
// If the position isn't in a loaded chunk, return the baseLevel to make the edge-of-world water flat
213+
if (!loadedChunks.contains(new ChunkPosition(x >> 4, z >> 4))) {
214+
return baseLevel;
215+
}
216+
205217
Material corner = octree.getMaterial(x, cy, z, palette);
206218
if (corner instanceof Lava) {
207219
Material above = octree.getMaterial(x, cy + 1, z, palette);

chunky/src/java/se/llbit/chunky/renderer/scene/Scene.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1354,7 +1354,7 @@ public synchronized void loadChunks(TaskTracker taskTracker, World world, Collec
13541354
}
13551355
}
13561356
}
1357-
OctreeFinalizer.finalizeChunk(worldOctree, waterOctree, palette, origin, cp, yMin, yMax);
1357+
OctreeFinalizer.finalizeChunk(worldOctree, waterOctree, palette, loadedChunks, origin, cp, yMin, yMax);
13581358
if (legacyChunks.contains(cp)) {
13591359
LegacyBlocksFinalizer
13601360
.finalizeChunk(worldOctree, waterOctree, palette, origin, cp, yMin, yMax);

0 commit comments

Comments
 (0)