Skip to content

Commit 2935b43

Browse files
committed
Fix translucency resort
1 parent 95fc2c3 commit 2935b43

File tree

6 files changed

+91
-68
lines changed

6 files changed

+91
-68
lines changed

core/src/main/java/dev/compactmods/gander/core/math/WorldMath.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package dev.compactmods.gander.core.math;
22

33
import net.minecraft.core.BlockPos;
4+
import net.minecraft.core.SectionPos;
45
import net.minecraft.util.Mth;
56
import net.minecraft.util.RandomSource;
67
import net.minecraft.world.level.ChunkPos;
78
import net.minecraft.world.level.Level;
89
import net.minecraft.world.phys.AABB;
910

11+
import java.util.Set;
12+
import java.util.function.Consumer;
13+
import java.util.stream.Collectors;
1014
import java.util.stream.Stream;
1115

1216
public class WorldMath {
@@ -27,6 +31,12 @@ public static AABB chunkAABB(Level level, ChunkPos chunkPos) {
2731
return AABB.encapsulatingFullBlocks(minBlock, maxBlock);
2832
}
2933

34+
public static AABB sectionABB(SectionPos sectionPos) {
35+
var minBlock = new BlockPos(sectionPos.minBlockX(), sectionPos.minBlockY(), sectionPos.minBlockZ());
36+
var maxBlock = new BlockPos(sectionPos.maxBlockX(), sectionPos.maxBlockY(), sectionPos.maxBlockZ());
37+
return AABB.encapsulatingFullBlocks(minBlock, maxBlock);
38+
}
39+
3040
public static BlockPos randomPosInAABB(RandomSource random, AABB aabb) {
3141
int rx = random.nextIntBetweenInclusive(Mth.floor(aabb.minX), Mth.floor(aabb.maxX));
3242
int ry = random.nextIntBetweenInclusive(Mth.floor(aabb.minY), Mth.floor(aabb.maxY));
@@ -38,4 +48,13 @@ public static Stream<ChunkPos> chunkPositions(AABB aabb) {
3848
return ChunkPos.rangeClosed(minCornerChunk(aabb), maxCornerChunk(aabb));
3949
}
4050

51+
public static Stream<SectionPos> sectionPositions(Level level, AABB area) {
52+
final var minChunk = WorldMath.minCornerChunk(area);
53+
final var maxChunk = WorldMath.maxCornerChunk(area);
54+
return ChunkPos.rangeClosed(minChunk, maxChunk)
55+
.mapMulti((ChunkPos cp, Consumer<SectionPos> nums) -> {
56+
for (int y = level.getMinSection(); y <= level.getMaxSection(); ++y)
57+
nums.accept(SectionPos.of(cp, y));
58+
});
59+
}
4160
}

rendering/src/main/java/dev/compactmods/gander/render/geometry/BakedLevel.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package dev.compactmods.gander.render.geometry;
22

3-
import net.minecraft.world.level.ChunkPos;
3+
import net.minecraft.core.SectionPos;
44
import net.minecraft.world.level.Level;
55

6-
import net.minecraft.world.level.levelgen.structure.BoundingBox;
7-
86
import net.minecraft.world.phys.AABB;
97

108
import org.joml.Vector3f;
@@ -13,7 +11,7 @@
1311

1412
public record BakedLevel(Level originalLevel,
1513
AABB blockBoundaries,
16-
Map<ChunkPos, BakedLevelSection> sections) {
14+
Map<SectionPos, BakedLevelSection> sections) {
1715

1816

1917
public void resortTranslucency(Vector3f vector3f) {

rendering/src/main/java/dev/compactmods/gander/render/geometry/BakedLevelSection.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.joml.Vector3f;
1414

1515
import java.util.Map;
16+
import java.util.function.Function;
1617

1718
public record BakedLevelSection(SectionBufferBuilderPack blockBuilders,
1819
SectionBufferBuilderPack fluidBuilders,
@@ -41,8 +42,11 @@ private void resortTranslucency(
4142
return;
4243

4344
var buffer = buffers.get(type);
44-
buffer.uploadIndexBuffer(result);
45-
VertexBuffer.unbind();
45+
if(buffer != null) {
46+
buffer.bind();
47+
buffer.uploadIndexBuffer(result);
48+
VertexBuffer.unbind();
49+
}
4650
});
4751
}
4852
}

rendering/src/main/java/dev/compactmods/gander/render/geometry/LevelBakery.java

Lines changed: 29 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -22,55 +22,43 @@
2222
import net.minecraft.client.renderer.texture.OverlayTexture;
2323
import net.minecraft.client.resources.model.BakedModel;
2424
import net.minecraft.core.BlockPos;
25+
import net.minecraft.core.SectionPos;
2526
import net.minecraft.util.RandomSource;
2627
import net.minecraft.world.level.ChunkPos;
2728
import net.minecraft.world.level.Level;
2829
import net.minecraft.world.level.block.RenderShape;
29-
import net.minecraft.world.level.block.entity.BlockEntity;
3030
import net.minecraft.world.level.block.state.BlockState;
31-
import net.minecraft.world.level.levelgen.structure.BoundingBox;
3231
import net.minecraft.world.level.material.FluidState;
3332

3433
import net.minecraft.world.phys.AABB;
3534
import net.neoforged.neoforge.client.model.data.ModelData;
3635

3736
import org.joml.Vector3f;
3837

39-
import java.util.ArrayList;
4038
import java.util.HashMap;
41-
import java.util.List;
4239
import java.util.Map;
4340
import java.util.Set;
41+
import java.util.function.Consumer;
4442
import java.util.stream.Collectors;
4543

4644
public class LevelBakery {
4745

4846
public static BakedLevel bakeVertices(Level level, AABB blockBoundaries, Vector3f cameraPosition) {
4947

50-
final var minChunk = WorldMath.minCornerChunk(blockBoundaries);
51-
final var maxChunk = WorldMath.maxCornerChunk(blockBoundaries);
48+
final var allSections = WorldMath.sectionPositions(level, blockBoundaries)
49+
.collect(Collectors.toSet());
5250

53-
Set<ChunkPos> allChunks = ChunkPos.rangeClosed(minChunk, maxChunk).collect(Collectors.toSet());
51+
Map<SectionPos, BakedLevelSection> bakedSections = new Reference2ObjectArrayMap<>();
52+
for (var sectionPos : allSections) {
5453

55-
Map<ChunkPos, BakedLevelSection> bakedSections = new Reference2ObjectArrayMap<>();
56-
for (ChunkPos chunkPos : allChunks) {
57-
58-
final AABB chunkArea = WorldMath.chunkAABB(level, chunkPos);
54+
final AABB chunkArea = WorldMath.sectionABB(sectionPos);
5955

6056
final SectionBufferBuilderPack blockPack = new SectionBufferBuilderPack();
6157
final SectionBufferBuilderPack fluidPack = new SectionBufferBuilderPack();
6258

6359
final Map<RenderType, BufferBuilder> blockBufferBuilders = new HashMap<>();
6460
final Map<RenderType, BufferBuilder> fluidBufferBuilders = new HashMap<>();
6561

66-
final Reference2ObjectArrayMap<RenderType, VertexBuffer> blockGeometry = new Reference2ObjectArrayMap<>();
67-
final Reference2ObjectArrayMap<RenderType, VertexBuffer> fluidGeometry = new Reference2ObjectArrayMap<>();
68-
69-
final Reference2ObjectArrayMap<RenderType, MeshData.SortState> blockRenderSortStates = new Reference2ObjectArrayMap<>();
70-
final Reference2ObjectArrayMap<RenderType, MeshData.SortState> fluidRenderSortStates = new Reference2ObjectArrayMap<>();
71-
72-
final var SORTING = VertexSorting.byDistance(cameraPosition.x, cameraPosition.y, cameraPosition.z);
73-
7462
PoseStack pose = new PoseStack();
7563
RandomSource random = RandomSource.createNewThreadLocalInstance();
7664
BlockRenderDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer();
@@ -81,15 +69,17 @@ public static BakedLevel bakeVertices(Level level, AABB blockBoundaries, Vector3
8169
createBlockGeometry(level, pos, pose, dispatcher, random, blockBufferBuilders, blockPack, renderer, fluidBufferBuilders);
8270
});
8371

84-
sortGeometry(blockBufferBuilders, blockPack, SORTING, blockRenderSortStates, blockGeometry, fluidBufferBuilders,
85-
fluidRenderSortStates, fluidGeometry);
72+
final var sorting = VertexSorting.byDistance(cameraPosition.x, cameraPosition.y, cameraPosition.z);
73+
74+
final var blockVertices = buildSortedGeometryBuffers(blockPack, sorting, blockBufferBuilders);
75+
final var fluidVertices = buildSortedGeometryBuffers(fluidPack, sorting, fluidBufferBuilders);
8676

8777
final var bakedSection = new BakedLevelSection(blockPack, fluidPack,
88-
blockGeometry, fluidGeometry,
89-
blockRenderSortStates, fluidRenderSortStates,
78+
blockVertices.buffers(), fluidVertices.buffers(),
79+
blockVertices.meshStates(), fluidVertices.meshStates(),
9080
chunkArea);
9181

92-
bakedSections.put(chunkPos, bakedSection);
82+
bakedSections.put(sectionPos, bakedSection);
9383
}
9484

9585
return new BakedLevel(level, blockBoundaries, bakedSections);
@@ -139,39 +129,33 @@ private static void createBlockGeometry(Level level, BlockPos pos, PoseStack pos
139129

140130
pose.popPose();
141131
ModelBlockRenderer.clearCache();
142-
}
143-
144-
private static void sortGeometry(Map<RenderType, BufferBuilder> blockBufferBuilders, SectionBufferBuilderPack blockPack, VertexSorting SORTING, Reference2ObjectArrayMap<RenderType, MeshData.SortState> blockRenderSortStates, Reference2ObjectArrayMap<RenderType, VertexBuffer> blockGeometry, Map<RenderType, BufferBuilder> fluidBufferBuilders, Reference2ObjectArrayMap<RenderType, MeshData.SortState> fluidRenderSortStates, Reference2ObjectArrayMap<RenderType, VertexBuffer> fluidGeometry) {
145-
blockBufferBuilders.forEach((renderType, builder) -> {
146-
final var buffer = builder.build();
147-
if (buffer == null) return;
148132

149-
if (renderType.sortOnUpload()) {
150-
var state = buffer.sortQuads(blockPack.buffer(renderType), SORTING);
151-
blockRenderSortStates.put(renderType, state);
152-
}
133+
// TODO: Make Result Record so this can be immutable
134+
}
153135

154-
var vb = new VertexBuffer(VertexBuffer.Usage.STATIC);
155-
vb.bind();
156-
vb.upload(buffer);
157-
VertexBuffer.unbind();
158-
blockGeometry.put(renderType, vb);
159-
});
136+
private static SortedGeometryBufferResult buildSortedGeometryBuffers(SectionBufferBuilderPack blockPack,
137+
VertexSorting sorting,
138+
Map<RenderType, BufferBuilder> bufferBuilders
139+
) {
140+
final var renderSortStates = new Reference2ObjectArrayMap<RenderType, MeshData.SortState>();
141+
final var vertexBuffers = new Reference2ObjectArrayMap<RenderType, VertexBuffer>();
160142

161-
fluidBufferBuilders.forEach((renderType, builder) -> {
143+
bufferBuilders.forEach((renderType, builder) -> {
162144
final var buffer = builder.build();
163145
if (buffer == null) return;
164146

165147
if (renderType.sortOnUpload()) {
166-
var state = buffer.sortQuads(blockPack.buffer(renderType), SORTING);
167-
fluidRenderSortStates.put(renderType, state);
148+
var state = buffer.sortQuads(blockPack.buffer(renderType), sorting);
149+
renderSortStates.put(renderType, state);
168150
}
169151

170-
var vb = new VertexBuffer(VertexBuffer.Usage.STATIC);
152+
VertexBuffer vb = new VertexBuffer(VertexBuffer.Usage.STATIC);
171153
vb.bind();
172154
vb.upload(buffer);
173155
VertexBuffer.unbind();
174-
fluidGeometry.put(renderType, vb);
156+
vertexBuffers.put(renderType, vb);
175157
});
158+
159+
return new SortedGeometryBufferResult(vertexBuffers, renderSortStates);
176160
}
177161
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package dev.compactmods.gander.render.geometry;
2+
3+
import com.mojang.blaze3d.vertex.MeshData;
4+
import com.mojang.blaze3d.vertex.VertexBuffer;
5+
6+
import net.minecraft.client.renderer.RenderType;
7+
8+
import java.util.Map;
9+
10+
public record SortedGeometryBufferResult(Map<RenderType, VertexBuffer> buffers, Map<RenderType, MeshData.SortState> meshStates) {
11+
}

testmod/src/main/java/dev/compactmods/gander/client/gui/GanderUI.java

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class GanderUI extends Screen {
2323
private SpatialRenderer activeRenderer;
2424
private Component sceneSource;
2525

26+
private boolean singlePanel = false;
27+
2628
GanderUI() {
2729
super(Component.empty());
2830
}
@@ -154,27 +156,32 @@ public void setScene(BakedLevel scene) {
154156

155157
this.renderables.clear();
156158

157-
this.activeRenderer = addRenderableOnly(new SpatialRenderer(this.scene, 100, 20, 200, 100));
158-
this.activeRenderer.camera().zoom(-10);
159+
if(singlePanel) {
160+
this.activeRenderer = addRenderableOnly(new SpatialRenderer(this.scene, 0, 0, width, height));
161+
this.activeRenderer.camera().zoom(-10);
162+
} else {
163+
this.activeRenderer = addRenderableOnly(new SpatialRenderer(this.scene, 100, 20, 200, 100));
164+
this.activeRenderer.camera().zoom(-10);
159165

160-
var s2 = addRenderableOnly(new SpatialRenderer(this.scene, 310, 20, 200, 100));
161-
s2.camera().lookDirection(Direction.DOWN);
162-
s2.camera().zoom(-10);
166+
var s2 = addRenderableOnly(new SpatialRenderer(this.scene, 310, 20, 200, 100));
167+
s2.camera().lookDirection(Direction.DOWN);
168+
s2.camera().zoom(-10);
163169

164-
var s3 = addRenderableOnly(new SpatialRenderer(this.scene, 100, 130, 200, 100));
165-
s3.camera().lookDirection(Direction.NORTH);
166-
s3.camera().zoom(-10);
170+
var s3 = addRenderableOnly(new SpatialRenderer(this.scene, 100, 130, 200, 100));
171+
s3.camera().lookDirection(Direction.NORTH);
172+
s3.camera().zoom(-10);
167173

168-
var s4 = addRenderableOnly(new SpatialRenderer(this.scene, 310, 130, 200, 100));
169-
s4.camera().lookDirection(Direction.SOUTH);
170-
s4.camera().zoom(-10);
174+
var s4 = addRenderableOnly(new SpatialRenderer(this.scene, 310, 130, 200, 100));
175+
s4.camera().lookDirection(Direction.SOUTH);
176+
s4.camera().zoom(-10);
171177

172-
var s5 = addRenderableOnly(new SpatialRenderer(this.scene, 100, 240, 200, 100));
173-
s5.camera().lookDirection(Direction.WEST);
174-
s5.camera().zoom(-10);
178+
var s5 = addRenderableOnly(new SpatialRenderer(this.scene, 100, 240, 200, 100));
179+
s5.camera().lookDirection(Direction.WEST);
180+
s5.camera().zoom(-10);
175181

176-
var s6 = addRenderableOnly(new SpatialRenderer(this.scene, 310, 240, 200, 100));
177-
s6.camera().lookDirection(Direction.EAST);
178-
s6.camera().zoom(-10);
182+
var s6 = addRenderableOnly(new SpatialRenderer(this.scene, 310, 240, 200, 100));
183+
s6.camera().lookDirection(Direction.EAST);
184+
s6.camera().zoom(-10);
185+
}
179186
}
180187
}

0 commit comments

Comments
 (0)