107 lines
3.6 KiB
Java
107 lines
3.6 KiB
Java
package net.minecraft.client.renderer;
|
|
|
|
import com.mojang.blaze3d.systems.RenderSystem;
|
|
import com.mojang.blaze3d.vertex.BufferBuilder;
|
|
import com.mojang.blaze3d.vertex.ByteBufferBuilder;
|
|
import com.mojang.blaze3d.vertex.MeshData;
|
|
import com.mojang.blaze3d.vertex.VertexConsumer;
|
|
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMaps;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.SequencedMap;
|
|
import net.fabricmc.api.EnvType;
|
|
import net.fabricmc.api.Environment;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public interface MultiBufferSource {
|
|
static MultiBufferSource.BufferSource immediate(ByteBufferBuilder sharedBuffer) {
|
|
return immediateWithBuffers(Object2ObjectSortedMaps.<RenderType, ByteBufferBuilder>emptyMap(), sharedBuffer);
|
|
}
|
|
|
|
static MultiBufferSource.BufferSource immediateWithBuffers(SequencedMap<RenderType, ByteBufferBuilder> fixedBuffers, ByteBufferBuilder sharedBuffer) {
|
|
return new MultiBufferSource.BufferSource(sharedBuffer, fixedBuffers);
|
|
}
|
|
|
|
VertexConsumer getBuffer(RenderType renderType);
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public static class BufferSource implements MultiBufferSource {
|
|
protected final ByteBufferBuilder sharedBuffer;
|
|
protected final SequencedMap<RenderType, ByteBufferBuilder> fixedBuffers;
|
|
protected final Map<RenderType, BufferBuilder> startedBuilders = new HashMap();
|
|
@Nullable
|
|
protected RenderType lastSharedType;
|
|
|
|
protected BufferSource(ByteBufferBuilder sharedBuffer, SequencedMap<RenderType, ByteBufferBuilder> fixedBuffers) {
|
|
this.sharedBuffer = sharedBuffer;
|
|
this.fixedBuffers = fixedBuffers;
|
|
}
|
|
|
|
@Override
|
|
public VertexConsumer getBuffer(RenderType renderType) {
|
|
BufferBuilder bufferBuilder = (BufferBuilder)this.startedBuilders.get(renderType);
|
|
if (bufferBuilder != null && !renderType.canConsolidateConsecutiveGeometry()) {
|
|
this.endBatch(renderType, bufferBuilder);
|
|
bufferBuilder = null;
|
|
}
|
|
|
|
if (bufferBuilder != null) {
|
|
return bufferBuilder;
|
|
} else {
|
|
ByteBufferBuilder byteBufferBuilder = (ByteBufferBuilder)this.fixedBuffers.get(renderType);
|
|
if (byteBufferBuilder != null) {
|
|
bufferBuilder = new BufferBuilder(byteBufferBuilder, renderType.mode(), renderType.format());
|
|
} else {
|
|
if (this.lastSharedType != null) {
|
|
this.endBatch(this.lastSharedType);
|
|
}
|
|
|
|
bufferBuilder = new BufferBuilder(this.sharedBuffer, renderType.mode(), renderType.format());
|
|
this.lastSharedType = renderType;
|
|
}
|
|
|
|
this.startedBuilders.put(renderType, bufferBuilder);
|
|
return bufferBuilder;
|
|
}
|
|
}
|
|
|
|
public void endLastBatch() {
|
|
if (this.lastSharedType != null) {
|
|
this.endBatch(this.lastSharedType);
|
|
this.lastSharedType = null;
|
|
}
|
|
}
|
|
|
|
public void endBatch() {
|
|
this.endLastBatch();
|
|
|
|
for (RenderType renderType : this.fixedBuffers.keySet()) {
|
|
this.endBatch(renderType);
|
|
}
|
|
}
|
|
|
|
public void endBatch(RenderType renderType) {
|
|
BufferBuilder bufferBuilder = (BufferBuilder)this.startedBuilders.remove(renderType);
|
|
if (bufferBuilder != null) {
|
|
this.endBatch(renderType, bufferBuilder);
|
|
}
|
|
}
|
|
|
|
private void endBatch(RenderType renderType, BufferBuilder builder) {
|
|
MeshData meshData = builder.build();
|
|
if (meshData != null) {
|
|
if (renderType.sortOnUpload()) {
|
|
ByteBufferBuilder byteBufferBuilder = (ByteBufferBuilder)this.fixedBuffers.getOrDefault(renderType, this.sharedBuffer);
|
|
meshData.sortQuads(byteBufferBuilder, RenderSystem.getProjectionType().vertexSorting());
|
|
}
|
|
|
|
renderType.draw(meshData);
|
|
}
|
|
|
|
if (renderType.equals(this.lastSharedType)) {
|
|
this.lastSharedType = null;
|
|
}
|
|
}
|
|
}
|
|
}
|