24
24
import se .llbit .math .Octree ;
25
25
import se .llbit .math .Vector3i ;
26
26
27
+ import java .util .Set ;
28
+
27
29
/**
28
30
* Processes the Octree after it has been loaded and updates block states for blocks that depend on
29
31
* neighbor blocks. Octree finalization is be done after all chunks have been loaded because before
@@ -41,7 +43,7 @@ public class OctreeFinalizer {
41
43
* @param cp Position of the chunk to finalize
42
44
*/
43
45
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 ) {
45
47
for (int cy = yMin ; cy < yMax ; ++cy ) {
46
48
for (int cz = 0 ; cz < 16 ; ++cz ) {
47
49
int z = cz + cp .z * 16 - origin .z ;
@@ -50,7 +52,7 @@ public static void finalizeChunk(Octree worldTree, Octree waterTree, BlockPalett
50
52
// process blocks that are at the edge of the chunk, the other should have be taken care of during the loading
51
53
if (cy == yMin || cy == yMax - 1 || cz == 0 || cz == 15 || cx == 0 || cx == 15 ) {
52
54
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 );
54
56
}
55
57
}
56
58
}
@@ -75,8 +77,8 @@ private static void hideBlocks(Octree worldTree, BlockPalette palette, int x,
75
77
}
76
78
}
77
79
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 ) {
80
82
int y = cy - origin .y ;
81
83
Material mat = worldTree .getMaterial (x , y , z , palette );
82
84
Material wmat = waterTree .getMaterial (x , y , z , palette );
@@ -91,32 +93,32 @@ private static void processBlock(Octree worldTree, Octree waterTree, BlockPalett
91
93
int corner2 = level0 ;
92
94
int corner3 = level0 ;
93
95
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 );
95
97
corner3 += level ;
96
98
corner0 += level ;
97
99
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 );
99
101
corner0 += level ;
100
102
101
- level = waterLevelAt (worldTree , waterTree , palette , x , y , z + 1 , level0 );
103
+ level = waterLevelAt (worldTree , waterTree , palette , loadedChunks , x , y , z + 1 , level0 );
102
104
corner0 += level ;
103
105
corner1 += level ;
104
106
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 );
106
108
corner1 += level ;
107
109
108
- level = waterLevelAt (worldTree , waterTree , palette , x + 1 , y , z , level0 );
110
+ level = waterLevelAt (worldTree , waterTree , palette , loadedChunks , x + 1 , y , z , level0 );
109
111
corner1 += level ;
110
112
corner2 += level ;
111
113
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 );
113
115
corner2 += level ;
114
116
115
- level = waterLevelAt (worldTree , waterTree , palette , x , y , z - 1 , level0 );
117
+ level = waterLevelAt (worldTree , waterTree , palette , loadedChunks , x , y , z - 1 , level0 );
116
118
corner2 += level ;
117
119
corner3 += level ;
118
120
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 );
120
122
corner3 += level ;
121
123
122
124
corner0 = Math .min (7 , 8 - (corner0 / 4 ));
@@ -142,32 +144,32 @@ private static void processBlock(Octree worldTree, Octree waterTree, BlockPalett
142
144
int corner2 = level0 ;
143
145
int corner3 = level0 ;
144
146
145
- int level = lavaLevelAt (worldTree , palette , x - 1 , y , z , level0 );
147
+ int level = lavaLevelAt (worldTree , palette , loadedChunks , x - 1 , y , z , level0 );
146
148
corner3 += level ;
147
149
corner0 += level ;
148
150
149
- level = lavaLevelAt (worldTree , palette , x - 1 , y , z + 1 , level0 );
151
+ level = lavaLevelAt (worldTree , palette , loadedChunks , x - 1 , y , z + 1 , level0 );
150
152
corner0 += level ;
151
153
152
- level = lavaLevelAt (worldTree , palette , x , y , z + 1 , level0 );
154
+ level = lavaLevelAt (worldTree , palette , loadedChunks , x , y , z + 1 , level0 );
153
155
corner0 += level ;
154
156
corner1 += level ;
155
157
156
- level = lavaLevelAt (worldTree , palette , x + 1 , y , z + 1 , level0 );
158
+ level = lavaLevelAt (worldTree , palette , loadedChunks , x + 1 , y , z + 1 , level0 );
157
159
corner1 += level ;
158
160
159
- level = lavaLevelAt (worldTree , palette , x + 1 , y , z , level0 );
161
+ level = lavaLevelAt (worldTree , palette , loadedChunks , x + 1 , y , z , level0 );
160
162
corner1 += level ;
161
163
corner2 += level ;
162
164
163
- level = lavaLevelAt (worldTree , palette , x + 1 , y , z - 1 , level0 );
165
+ level = lavaLevelAt (worldTree , palette , loadedChunks , x + 1 , y , z - 1 , level0 );
164
166
corner2 += level ;
165
167
166
- level = lavaLevelAt (worldTree , palette , x , y , z - 1 , level0 );
168
+ level = lavaLevelAt (worldTree , palette , loadedChunks , x , y , z - 1 , level0 );
167
169
corner2 += level ;
168
170
corner3 += level ;
169
171
170
- level = lavaLevelAt (worldTree , palette , x - 1 , y , z - 1 , level0 );
172
+ level = lavaLevelAt (worldTree , palette , loadedChunks , x - 1 , y , z - 1 , level0 );
171
173
corner3 += level ;
172
174
173
175
corner0 = Math .min (7 , 8 - (corner0 / 4 ));
@@ -185,8 +187,13 @@ private static void processBlock(Octree worldTree, Octree waterTree, BlockPalett
185
187
}
186
188
}
187
189
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
+
190
197
Material corner = waterTree .getMaterial (x , cy , z , palette );
191
198
if (corner instanceof Water ) {
192
199
Material above = waterTree .getMaterial (x , cy + 1 , z , palette );
@@ -201,7 +208,12 @@ private static int waterLevelAt(Octree worldTree, Octree waterTree,
201
208
}
202
209
203
210
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
+
205
217
Material corner = octree .getMaterial (x , cy , z , palette );
206
218
if (corner instanceof Lava ) {
207
219
Material above = octree .getMaterial (x , cy + 1 , z , palette );
0 commit comments