Skip to content

Commit 0c8a3d9

Browse files
committed
Do region sorting even when the tree traversal does section ordering correctly
1 parent f7ad64a commit 0c8a3d9

File tree

1 file changed

+29
-30
lines changed

1 file changed

+29
-30
lines changed

common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/lists/RenderListProvider.java

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,40 +12,39 @@ public interface RenderListProvider extends SortItemsProvider {
1212

1313
default SortedRenderLists createRenderLists(Viewport viewport) {
1414
var sectionPos = viewport.getChunkCoord();
15-
var renderLists = this.getUnsortedRenderLists();
16-
17-
// sort the regions by distance to fix rare region ordering bugs if necessary
18-
if (!this.orderIsSorted()) {
19-
var cameraX = sectionPos.getX() >> RenderRegion.REGION_WIDTH_SH;
20-
var cameraY = sectionPos.getY() >> RenderRegion.REGION_HEIGHT_SH;
21-
var cameraZ = sectionPos.getZ() >> RenderRegion.REGION_LENGTH_SH;
22-
23-
var size = renderLists.size();
24-
var sortItems = this.ensureSortItemsOfLength(size);
25-
26-
for (var i = 0; i < size; i++) {
27-
var region = renderLists.get(i).getRegion();
28-
var x = Math.abs(region.getX() - cameraX);
29-
var y = Math.abs(region.getY() - cameraY);
30-
var z = Math.abs(region.getZ() - cameraZ);
31-
sortItems[i] = (x + y + z) << 16 | i;
32-
}
33-
34-
IntArrays.unstableSort(sortItems, 0, size);
35-
36-
var sorted = new ObjectArrayList<ChunkRenderList>(size);
37-
for (var i = 0; i < size; i++) {
38-
var key = sortItems[i];
39-
var renderList = renderLists.get(key & 0xFFFF);
40-
sorted.add(renderList);
41-
}
42-
renderLists = sorted;
15+
var unsorted = this.getUnsortedRenderLists();
16+
17+
// sort the regions by distance to fix rare region ordering problems.
18+
// regions need to be sorted even when the order is generated by a correctly traversed section tree
19+
// but sections don't need to be sorted within regions
20+
var cameraX = sectionPos.getX() >> RenderRegion.REGION_WIDTH_SH;
21+
var cameraY = sectionPos.getY() >> RenderRegion.REGION_HEIGHT_SH;
22+
var cameraZ = sectionPos.getZ() >> RenderRegion.REGION_LENGTH_SH;
23+
24+
var size = unsorted.size();
25+
var sortItems = this.ensureSortItemsOfLength(size);
26+
27+
for (var i = 0; i < size; i++) {
28+
var region = unsorted.get(i).getRegion();
29+
var x = Math.abs(region.getX() - cameraX);
30+
var y = Math.abs(region.getY() - cameraY);
31+
var z = Math.abs(region.getZ() - cameraZ);
32+
sortItems[i] = (x + y + z) << 16 | i;
4333
}
4434

45-
for (var list : renderLists) {
35+
IntArrays.unstableSort(sortItems, 0, size);
36+
37+
var sorted = new ObjectArrayList<ChunkRenderList>(size);
38+
for (var i = 0; i < size; i++) {
39+
var key = sortItems[i];
40+
var renderList = unsorted.get(key & 0xFFFF);
41+
sorted.add(renderList);
42+
}
43+
44+
for (var list : sorted) {
4645
list.prepareForRender(sectionPos, this);
4746
}
4847

49-
return new SortedRenderLists(renderLists);
48+
return new SortedRenderLists(sorted);
5049
}
5150
}

0 commit comments

Comments
 (0)