Skip to content

Commit 911f1ca

Browse files
committed
Builders all the way down
- BufferBuilderStack -> ByteBufferBuilderStack - Create BufferBuilders on the fly, re-using backing memory - Hard code buffer builders to triangles/block vertex format since we expect this to only be used for block geometry
1 parent 6273fd9 commit 911f1ca

File tree

5 files changed

+23
-24
lines changed

5 files changed

+23
-24
lines changed

common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BufferBuilderStack.java renamed to common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ByteBufferBuilderStack.java

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,23 @@
11
package dev.engine_room.flywheel.lib.model.baked;
22

3-
import com.mojang.blaze3d.vertex.BufferBuilder;
43
import com.mojang.blaze3d.vertex.ByteBufferBuilder;
54

65
import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
7-
import net.minecraft.client.renderer.RenderType;
86

9-
class BufferBuilderStack {
7+
class ByteBufferBuilderStack {
108
private static final int INITIAL_CAPACITY_BYTES = 256 * 32;
119

1210
private int nextBufferBuilderIndex = 0;
13-
private final ReferenceArrayList<BufferBuilder> bufferBuilders = new ReferenceArrayList<>();
11+
private final ReferenceArrayList<ByteBufferBuilder> bufferBuilders = new ReferenceArrayList<>();
1412

15-
private final RenderType renderType;
16-
17-
BufferBuilderStack(RenderType renderType) {
18-
this.renderType = renderType;
19-
}
20-
21-
BufferBuilder getOrCreateBufferBuilder() {
22-
BufferBuilder bufferBuilder;
13+
ByteBufferBuilder nextOrCreate() {
14+
ByteBufferBuilder bufferBuilder;
2315
if (nextBufferBuilderIndex < bufferBuilders.size()) {
2416
bufferBuilder = bufferBuilders.get(nextBufferBuilderIndex);
2517
} else {
2618
// Need to allocate at least some memory up front, as BufferBuilder internally
2719
// only calls `ensureCapacity` after writing a vertex.
28-
bufferBuilder = new BufferBuilder(new ByteBufferBuilder(INITIAL_CAPACITY_BYTES), renderType.mode(), renderType.format());
20+
bufferBuilder = new ByteBufferBuilder(INITIAL_CAPACITY_BYTES);
2921
bufferBuilders.add(bufferBuilder);
3022
}
3123
nextBufferBuilderIndex++;

common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,18 @@
66

77
import com.google.common.collect.ImmutableList;
88
import com.mojang.blaze3d.vertex.BufferBuilder;
9+
import com.mojang.blaze3d.vertex.ByteBufferBuilder;
10+
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
11+
import com.mojang.blaze3d.vertex.VertexFormat;
912

1013
import dev.engine_room.flywheel.api.material.Material;
1114
import dev.engine_room.flywheel.api.model.Mesh;
1215
import dev.engine_room.flywheel.api.model.Model;
13-
import net.minecraft.client.renderer.RenderType;
1416

1517
class MeshEmitter {
1618
private static final int INITIAL_CAPACITY = 1;
1719

18-
private final BufferBuilderStack bufferBuilderStack;
20+
private final ByteBufferBuilderStack byteBufferBuilderStack;
1921

2022
private Material @UnknownNullability [] materials = new Material[INITIAL_CAPACITY];
2123
private BufferBuilder @UnknownNullability [] bufferBuilders = new BufferBuilder[INITIAL_CAPACITY];
@@ -28,8 +30,8 @@ class MeshEmitter {
2830

2931
private int currentIndex = 0;
3032

31-
MeshEmitter(RenderType renderType) {
32-
this.bufferBuilderStack = new BufferBuilderStack(renderType);
33+
MeshEmitter(ByteBufferBuilderStack byteBufferBuilderStack) {
34+
this.byteBufferBuilderStack = byteBufferBuilderStack;
3335
}
3436

3537
public void prepare(BlockMaterialFunction blockMaterialFunction) {
@@ -84,7 +86,10 @@ public BufferBuilder getBuffer(Material material) {
8486
resize(materials.length * 2);
8587
}
8688

87-
BufferBuilder bufferBuilder = bufferBuilderStack.getOrCreateBufferBuilder();
89+
ByteBufferBuilder byteBufferBuilder = byteBufferBuilderStack.nextOrCreate();
90+
91+
// This is only used for block models in the 5 chunk render types, so we can hard-code the mode and format.
92+
BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.BLOCK);
8893

8994
// currentIndex == numBufferBuildersPopulated here.
9095
materials[currentIndex] = material;

common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.engine_room.flywheel.lib.model.baked;
22

3-
import java.util.function.Function;
3+
import java.util.function.BiFunction;
44

55
import org.jetbrains.annotations.Nullable;
66
import org.jetbrains.annotations.UnknownNullability;
@@ -19,13 +19,14 @@ class MeshEmitterManager<T extends MeshEmitter> {
1919
private static final RenderType[] CHUNK_LAYERS = RenderType.chunkBufferLayers().toArray(RenderType[]::new);
2020

2121
private final Reference2ReferenceMap<RenderType, T> emitterMap = new Reference2ReferenceArrayMap<>();
22+
private final ByteBufferBuilderStack byteBufferBuilderStack = new ByteBufferBuilderStack();
2223

2324
@UnknownNullability
2425
private BlockMaterialFunction blockMaterialFunction;
2526

26-
MeshEmitterManager(Function<RenderType, T> meshEmitterFactory) {
27+
MeshEmitterManager(BiFunction<ByteBufferBuilderStack, RenderType, T> meshEmitterFactory) {
2728
for (RenderType renderType : CHUNK_LAYERS) {
28-
emitterMap.put(renderType, meshEmitterFactory.apply(renderType));
29+
emitterMap.put(renderType, meshEmitterFactory.apply(byteBufferBuilderStack, renderType));
2930
}
3031
}
3132

@@ -35,6 +36,7 @@ public T getEmitter(RenderType renderType) {
3536

3637
public void prepare(BlockMaterialFunction blockMaterialFunction) {
3738
this.blockMaterialFunction = blockMaterialFunction;
39+
byteBufferBuilderStack.reset();
3840

3941
for (MeshEmitter emitter : emitterMap.values()) {
4042
emitter.prepare(blockMaterialFunction);

fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class FabricMeshEmitterManager extends MeshEmitterManager<MeshEmitter> implement
3434
private BufferBuilder currentDelegate;
3535

3636
FabricMeshEmitterManager() {
37-
super(MeshEmitter::new);
37+
super((bufferBuilderStack, $) -> new MeshEmitter(bufferBuilderStack));
3838
}
3939

4040
public BakedModel prepareForModel(BakedModel model, RenderType defaultLayer, boolean useAo, boolean defaultAo) {

neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoforgeMeshEmitter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ public class NeoforgeMeshEmitter extends MeshEmitter implements VertexConsumer {
1818

1919
private boolean defaultAo;
2020

21-
NeoforgeMeshEmitter(RenderType renderType) {
22-
super(renderType);
21+
NeoforgeMeshEmitter(ByteBufferBuilderStack byteBufferBuilderStack, RenderType renderType) {
22+
super(byteBufferBuilderStack);
2323
this.renderType = renderType;
2424
}
2525

0 commit comments

Comments
 (0)