MultiBufferSource.java

net.minecraft.client.renderer.MultiBufferSource

信息

  • 全限定名:net.minecraft.client.renderer.MultiBufferSource
  • 类型:public interface
  • 包:net.minecraft.client.renderer
  • 源码路径:src/main/java/net/minecraft/client/renderer/MultiBufferSource.java
  • 起始行号:L18
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

  • net.minecraft.client.renderer.MultiBufferSource.BufferSource
    • 类型: class
    • 修饰符: public static
    • 源码定位: L30
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

static MultiBufferSource.BufferSource immediate(ByteBufferBuilder buffer) @ L19

  • 方法名:immediate
  • 源码定位:L19
  • 返回类型:MultiBufferSource.BufferSource
  • 修饰符:static

参数:

  • buffer: ByteBufferBuilder

说明:

TODO

static MultiBufferSource.BufferSource immediateWithBuffers(SequencedMap<RenderType,ByteBufferBuilder> fixedBuffers, ByteBufferBuilder sharedBuffer) @ L23

  • 方法名:immediateWithBuffers
  • 源码定位:L23
  • 返回类型:MultiBufferSource.BufferSource
  • 修饰符:static

参数:

  • fixedBuffers: SequencedMap<RenderType,ByteBufferBuilder>
  • sharedBuffer: ByteBufferBuilder

说明:

TODO

VertexConsumer getBuffer(RenderType renderType) @ L27

  • 方法名:getBuffer
  • 源码定位:L27
  • 返回类型:VertexConsumer
  • 修饰符:package-private

参数:

  • renderType: RenderType

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public interface MultiBufferSource {
    static MultiBufferSource.BufferSource immediate(ByteBufferBuilder buffer) {
        return immediateWithBuffers(Object2ObjectSortedMaps.emptyMap(), buffer);
    }
 
    static MultiBufferSource.BufferSource immediateWithBuffers(SequencedMap<RenderType, ByteBufferBuilder> fixedBuffers, ByteBufferBuilder sharedBuffer) {
        return new MultiBufferSource.BufferSource(sharedBuffer, fixedBuffers);
    }
 
    VertexConsumer getBuffer(final RenderType renderType);
 
    @OnlyIn(Dist.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<>();
        protected @Nullable RenderType lastSharedType;
 
        protected BufferSource(ByteBufferBuilder sharedBuffer, SequencedMap<RenderType, ByteBufferBuilder> fixedBuffers) {
            this.sharedBuffer = sharedBuffer;
            this.fixedBuffers = fixedBuffers;
        }
 
        @Override
        public VertexConsumer getBuffer(RenderType renderType) {
            BufferBuilder builder = this.startedBuilders.get(renderType);
            if (builder != null && !renderType.canConsolidateConsecutiveGeometry()) {
                this.endBatch(renderType, builder);
                builder = null;
            }
 
            if (builder != null) {
                return builder;
            } else {
                ByteBufferBuilder fixedBuffer = this.fixedBuffers.get(renderType);
                if (fixedBuffer != null) {
                    builder = new BufferBuilder(fixedBuffer, renderType.mode(), renderType.format());
                } else {
                    if (this.lastSharedType != null) {
                        this.endBatch(this.lastSharedType);
                    }
 
                    builder = new BufferBuilder(this.sharedBuffer, renderType.mode(), renderType.format());
                    this.lastSharedType = renderType;
                }
 
                this.startedBuilders.put(renderType, builder);
                return builder;
            }
        }
 
        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 type) {
            BufferBuilder builder = this.startedBuilders.remove(type);
            if (builder != null) {
                this.endBatch(type, builder);
            }
        }
 
        private void endBatch(RenderType type, BufferBuilder builder) {
            MeshData mesh = builder.build();
            if (mesh != null) {
                if (type.sortOnUpload()) {
                    ByteBufferBuilder buffer = this.fixedBuffers.getOrDefault(type, this.sharedBuffer);
                    mesh.sortQuads(buffer, RenderSystem.getProjectionType().vertexSorting());
                }
 
                type.draw(mesh);
            }
 
            if (type.equals(this.lastSharedType)) {
                this.lastSharedType = null;
            }
        }
    }
}

引用的其他类