Skip to content

Commit 15cef3f

Browse files
committed
self review
1 parent 92fab85 commit 15cef3f

10 files changed

Lines changed: 109 additions & 99 deletions

File tree

common/src/api/java/dev/engine_room/flywheel/api/material/Material.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package dev.engine_room.flywheel.api.material;
22

3+
import org.jetbrains.annotations.Nullable;
4+
35
import net.minecraft.resources.ResourceLocation;
46

57
public interface Material {
@@ -52,4 +54,39 @@ public interface Material {
5254
* @return The cardinal lighting mode.
5355
*/
5456
CardinalLightingMode cardinalLightingMode();
57+
58+
/**
59+
* Check for field-wise equality between this Material and another.
60+
*
61+
* @param other The nullable material to check equality against.
62+
* @return True if the materials represent the same configuration.
63+
*/
64+
default boolean equals(@Nullable Material other) {
65+
if (this == other) {
66+
return true;
67+
}
68+
69+
if (other == null) {
70+
return false;
71+
}
72+
73+
// @formatter:off
74+
return this.blur() == other.blur()
75+
&& this.mipmap() == other.mipmap()
76+
&& this.backfaceCulling() == other.backfaceCulling()
77+
&& this.polygonOffset() == other.polygonOffset()
78+
&& this.depthTest() == other.depthTest()
79+
&& this.transparency() == other.transparency()
80+
&& this.writeMask() == other.writeMask()
81+
&& this.useOverlay() == other.useOverlay()
82+
&& this.useLight() == other.useLight()
83+
&& this.cardinalLightingMode() == other.cardinalLightingMode()
84+
&& this.shaders().fragmentSource().equals(other.shaders().fragmentSource())
85+
&& this.shaders().vertexSource().equals(other.shaders().vertexSource())
86+
&& this.fog().source().equals(other.fog().source())
87+
&& this.cutout().source().equals(other.cutout().source())
88+
&& this.light().source().equals(other.light().source())
89+
&& this.texture().equals(other.texture());
90+
// @formatter:on
91+
}
5592
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package dev.engine_room.flywheel.lib.model.baked;
2+
3+
import com.mojang.blaze3d.vertex.BufferBuilder;
4+
5+
import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
6+
7+
class BufferBuilderStack {
8+
private static final int INITIAL_CAPACITY_VERTICES = 256;
9+
10+
private int nextBufferBuilderIndex = 0;
11+
private final ReferenceArrayList<BufferBuilder> bufferBuilders = new ReferenceArrayList<>();
12+
13+
BufferBuilder getOrCreateBufferBuilder() {
14+
BufferBuilder bufferBuilder;
15+
if (nextBufferBuilderIndex < bufferBuilders.size()) {
16+
bufferBuilder = bufferBuilders.get(nextBufferBuilderIndex);
17+
} else {
18+
// Need to allocate at least some memory up front, as BufferBuilder internally
19+
// only calls `ensureCapacity` after writing a vertex.
20+
bufferBuilder = new BufferBuilder(INITIAL_CAPACITY_VERTICES);
21+
bufferBuilders.add(bufferBuilder);
22+
}
23+
nextBufferBuilderIndex++;
24+
return bufferBuilder;
25+
}
26+
27+
public void reset() {
28+
nextBufferBuilderIndex = 0;
29+
}
30+
}

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

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,33 @@
22

33
import java.util.ArrayList;
44
import java.util.List;
5-
import java.util.function.Supplier;
6-
7-
import org.jetbrains.annotations.UnknownNullability;
85

96
import com.mojang.blaze3d.vertex.BufferBuilder;
107
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
118
import com.mojang.blaze3d.vertex.VertexFormat;
129

10+
import dev.engine_room.flywheel.api.material.Material;
11+
1312
class MeshEmitter {
14-
private final Supplier<BufferBuilder> bufferBuilderSupplier;
13+
private final BufferBuilderStack bufferBuilderStack;
1514

1615
private final List<BufferBuilder> activeBufferBuilders = new ArrayList<>();
17-
private final List<Object> activeKeys = new ArrayList<>();
16+
private final List<Material> activeKeys = new ArrayList<>();
1817

19-
@UnknownNullability
20-
ResultConsumer<Object> resultConsumer;
18+
ModelBuilderResultConsumer resultConsumer;
2119

2220
private int currentIndex = -1;
23-
@UnknownNullability
24-
private BufferBuilder currentBufferBuilder;
25-
@UnknownNullability
26-
private Object currentKey;
2721

28-
MeshEmitter(Supplier<BufferBuilder> bufferBuilderSupplier) {
29-
this.bufferBuilderSupplier = bufferBuilderSupplier;
22+
MeshEmitter(BufferBuilderStack bufferBuilderStack) {
23+
this.bufferBuilderStack = bufferBuilderStack;
3024
}
3125

32-
@SuppressWarnings("unchecked")
33-
public void prepare(ResultConsumer<?> resultConsumer) {
34-
this.resultConsumer = (ResultConsumer<Object>) resultConsumer;
26+
public void prepare(ModelBuilderResultConsumer resultConsumer) {
27+
this.resultConsumer = resultConsumer;
3528
}
3629

3730
public void prepareForBlock() {
3831
currentIndex = -1;
39-
currentBufferBuilder = null;
40-
currentKey = null;
4132
}
4233

4334
public void end() {
@@ -54,34 +45,27 @@ public void end() {
5445
activeKeys.clear();
5546
resultConsumer = null;
5647
currentIndex = -1;
57-
currentBufferBuilder = null;
58-
currentKey = null;
5948
}
6049

61-
public BufferBuilder getBuffer(Object key) {
62-
if (currentIndex < 0 || !key.equals(currentKey)) {
50+
public BufferBuilder getBuffer(Material key) {
51+
if (currentIndex < 0 || !key.equals(activeKeys.get(currentIndex))) {
6352
while (true) {
6453
currentIndex++;
6554

6655
if (currentIndex >= activeBufferBuilders.size()) {
67-
BufferBuilder bufferBuilder = bufferBuilderSupplier.get();
56+
BufferBuilder bufferBuilder = bufferBuilderStack.getOrCreateBufferBuilder();
6857
bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
6958
activeBufferBuilders.add(bufferBuilder);
7059
activeKeys.add(key);
71-
currentBufferBuilder = bufferBuilder;
72-
currentKey = key;
7360
break;
7461
}
7562

76-
Object searchKey = activeKeys.get(currentIndex);
77-
if (key.equals(searchKey)) {
78-
currentBufferBuilder = activeBufferBuilders.get(currentIndex);
79-
currentKey = searchKey;
63+
if (key.equals(activeKeys.get(currentIndex))) {
8064
break;
8165
}
8266
}
8367
}
8468

85-
return currentBufferBuilder;
69+
return activeBufferBuilders.get(currentIndex);
8670
}
8771
}
Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,39 @@
11
package dev.engine_room.flywheel.lib.model.baked;
22

33
import java.util.function.BiFunction;
4-
import java.util.function.Supplier;
54

65
import org.jetbrains.annotations.Nullable;
7-
import org.jetbrains.annotations.UnknownNullability;
86

97
import com.mojang.blaze3d.vertex.BufferBuilder;
108

11-
import it.unimi.dsi.fastutil.objects.Reference2ReferenceLinkedOpenHashMap;
9+
import dev.engine_room.flywheel.api.material.Material;
10+
import it.unimi.dsi.fastutil.objects.Reference2ReferenceArrayMap;
1211
import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap;
13-
import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
1412
import net.minecraft.client.renderer.RenderType;
1513

1614
class MeshEmitterManager<T extends MeshEmitter> {
1715
private static final RenderType[] CHUNK_LAYERS = RenderType.chunkBufferLayers().toArray(RenderType[]::new);
1816

19-
final Reference2ReferenceMap<RenderType, T> emitterMap = new Reference2ReferenceLinkedOpenHashMap<>();
20-
private final ReferenceArrayList<BufferBuilder> bufferBuilders = new ReferenceArrayList<>();
17+
final Reference2ReferenceMap<RenderType, T> emitterMap = new Reference2ReferenceArrayMap<>();
2118

22-
@UnknownNullability
23-
private ResultConsumer<?> resultConsumer;
24-
private int nextBufferBuilderIndex;
19+
private ModelBuilderResultConsumer resultConsumer;
2520

26-
MeshEmitterManager(BiFunction<Supplier<BufferBuilder>, RenderType, T> meshEmitterFactory) {
21+
private final BufferBuilderStack bufferBuilderStack = new BufferBuilderStack();
22+
23+
MeshEmitterManager(BiFunction<BufferBuilderStack, RenderType, T> meshEmitterFactory) {
2724
for (RenderType renderType : CHUNK_LAYERS) {
28-
T emitter = meshEmitterFactory.apply(this::getOrCreateBufferBuilder, renderType);
25+
T emitter = meshEmitterFactory.apply(bufferBuilderStack, renderType);
2926
emitterMap.put(renderType, emitter);
3027
}
3128
}
3229

33-
public void prepare(ResultConsumer<?> resultConsumer) {
30+
public T getEmitter(RenderType renderType) {
31+
return emitterMap.get(renderType);
32+
}
33+
34+
public void prepare(ModelBuilderResultConsumer resultConsumer) {
3435
this.resultConsumer = resultConsumer;
35-
nextBufferBuilderIndex = 0;
36+
bufferBuilderStack.reset();
3637

3738
for (MeshEmitter emitter : emitterMap.values()) {
3839
emitter.prepare(resultConsumer);
@@ -47,7 +48,7 @@ public void prepareForBlock() {
4748

4849
public void end() {
4950
resultConsumer = null;
50-
nextBufferBuilderIndex = 0;
51+
bufferBuilderStack.reset();
5152

5253
for (MeshEmitter emitter : emitterMap.values()) {
5354
emitter.end();
@@ -56,23 +57,11 @@ public void end() {
5657

5758
@Nullable
5859
public BufferBuilder getBuffer(RenderType renderType, boolean shade, boolean ao) {
59-
Object key = resultConsumer.createKey(renderType, shade, ao);
60+
Material key = resultConsumer.createKey(renderType, shade, ao);
6061
if (key != null) {
6162
return emitterMap.get(renderType).getBuffer(key);
6263
} else {
6364
return null;
6465
}
6566
}
66-
67-
private BufferBuilder getOrCreateBufferBuilder() {
68-
BufferBuilder bufferBuilder;
69-
if (nextBufferBuilderIndex < bufferBuilders.size()) {
70-
bufferBuilder = bufferBuilders.get(nextBufferBuilderIndex);
71-
} else {
72-
bufferBuilder = new BufferBuilder(0);
73-
bufferBuilders.add(bufferBuilder);
74-
}
75-
nextBufferBuilderIndex++;
76-
return bufferBuilder;
77-
}
7867
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,19 @@
1111
import dev.engine_room.flywheel.lib.model.SimpleModel;
1212
import net.minecraft.client.renderer.RenderType;
1313

14-
class ModelBuilderResultConsumer implements ResultConsumer<Material> {
14+
class ModelBuilderResultConsumer {
1515
private final BlockMaterialFunction materialFunc;
1616
private final ImmutableList.Builder<Model.ConfiguredMesh> meshes = ImmutableList.builder();
1717

1818
ModelBuilderResultConsumer(BlockMaterialFunction materialFunc) {
1919
this.materialFunc = materialFunc;
2020
}
2121

22-
@Override
2322
@Nullable
2423
public Material createKey(RenderType renderType, boolean shade, boolean ambientOcclusion) {
2524
return materialFunc.apply(renderType, shade, ambientOcclusion);
2625
}
2726

28-
@Override
2927
public void accept(Material material, BufferBuilder.RenderedBuffer data) {
3028
Mesh mesh = MeshHelper.blockVerticesToMesh(data, "source=ModelBuilder" + ",material=" + material);
3129
meshes.add(new Model.ConfiguredMesh(material, mesh));

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

Lines changed: 0 additions & 14 deletions
This file was deleted.

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ final class BakedModelBufferer {
2727
private BakedModelBufferer() {
2828
}
2929

30-
public static void bufferModel(BakedModel model, BlockPos pos, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, ResultConsumer<?> resultConsumer) {
30+
public static void bufferModel(BakedModel model, BlockPos pos, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, ModelBuilderResultConsumer resultConsumer) {
3131
ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
3232
if (poseStack == null) {
3333
poseStack = objects.identityPoseStack;
@@ -54,7 +54,7 @@ public static void bufferModel(BakedModel model, BlockPos pos, BlockAndTintGette
5454
emitters.end();
5555
}
5656

57-
public static void bufferBlocks(Iterator<BlockPos> posIterator, BlockAndTintGetter level, @Nullable PoseStack poseStack, boolean renderFluids, ResultConsumer<?> resultConsumer) {
57+
public static void bufferBlocks(Iterator<BlockPos> posIterator, BlockAndTintGetter level, @Nullable PoseStack poseStack, boolean renderFluids, ModelBuilderResultConsumer resultConsumer) {
5858
ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
5959
if (poseStack == null) {
6060
poseStack = objects.identityPoseStack;

forge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ final class BakedModelBufferer {
3030
private BakedModelBufferer() {
3131
}
3232

33-
public static void bufferModel(BakedModel model, BlockPos pos, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, ModelData modelData, ResultConsumer<?> resultConsumer) {
33+
public static void bufferModel(BakedModel model, BlockPos pos, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, ModelData modelData, ModelBuilderResultConsumer resultConsumer) {
3434
ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
3535
if (poseStack == null) {
3636
poseStack = objects.identityPoseStack;
3737
}
3838
RandomSource random = objects.random;
39-
ForgeMeshEmitterManager emitters = objects.emitters;
39+
MeshEmitterManager<ForgeMeshEmitter> emitters = objects.emitters;
4040

4141
emitters.prepare(resultConsumer);
4242

@@ -65,13 +65,13 @@ public static void bufferModel(BakedModel model, BlockPos pos, BlockAndTintGette
6565
emitters.end();
6666
}
6767

68-
public static void bufferBlocks(Iterator<BlockPos> posIterator, BlockAndTintGetter level, @Nullable PoseStack poseStack, Function<BlockPos, ModelData> modelDataLookup, boolean renderFluids, ResultConsumer<?> resultConsumer) {
68+
public static void bufferBlocks(Iterator<BlockPos> posIterator, BlockAndTintGetter level, @Nullable PoseStack poseStack, Function<BlockPos, ModelData> modelDataLookup, boolean renderFluids, ModelBuilderResultConsumer resultConsumer) {
6969
ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
7070
if (poseStack == null) {
7171
poseStack = objects.identityPoseStack;
7272
}
7373
RandomSource random = objects.random;
74-
ForgeMeshEmitterManager emitters = objects.emitters;
74+
MeshEmitterManager<ForgeMeshEmitter> emitters = objects.emitters;
7575
TransformingVertexConsumer transformingWrapper = objects.transformingWrapper;
7676

7777
emitters.prepare(resultConsumer);
@@ -141,7 +141,7 @@ private static class ThreadLocalObjects {
141141
public final PoseStack identityPoseStack = new PoseStack();
142142
public final RandomSource random = RandomSource.createNewThreadLocalInstance();
143143

144-
public final ForgeMeshEmitterManager emitters = new ForgeMeshEmitterManager();
144+
public final MeshEmitterManager<ForgeMeshEmitter> emitters = new MeshEmitterManager<>(ForgeMeshEmitter::new);
145145
public final TransformingVertexConsumer transformingWrapper = new TransformingVertexConsumer();
146146
}
147147
}

forge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ForgeMeshEmitter.java

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

3-
import java.util.function.Supplier;
4-
53
import org.jetbrains.annotations.ApiStatus;
64
import org.jetbrains.annotations.Nullable;
75

86
import com.mojang.blaze3d.vertex.BufferBuilder;
97
import com.mojang.blaze3d.vertex.PoseStack;
108
import com.mojang.blaze3d.vertex.VertexConsumer;
119

10+
import dev.engine_room.flywheel.api.material.Material;
1211
import net.minecraft.client.renderer.RenderType;
1312
import net.minecraft.client.renderer.block.ModelBlockRenderer;
1413
import net.minecraft.client.renderer.block.model.BakedQuad;
@@ -19,8 +18,8 @@ public class ForgeMeshEmitter extends MeshEmitter implements VertexConsumer {
1918

2019
private boolean defaultAo;
2120

22-
ForgeMeshEmitter(Supplier<BufferBuilder> bufferBuilderSupplier, RenderType renderType) {
23-
super(bufferBuilderSupplier);
21+
ForgeMeshEmitter(BufferBuilderStack bufferBuilderStack, RenderType renderType) {
22+
super(bufferBuilderStack);
2423
this.renderType = renderType;
2524
}
2625

@@ -37,7 +36,7 @@ public void prepareForModelLayer(boolean defaultAo) {
3736

3837
@Nullable
3938
private BufferBuilder getBuffer(boolean shade, boolean ao) {
40-
Object key = resultConsumer.createKey(renderType, shade, ao);
39+
Material key = resultConsumer.createKey(renderType, shade, ao);
4140
if (key != null) {
4241
return getBuffer(key);
4342
} else {

0 commit comments

Comments
 (0)