SectionCompiler.java

net.minecraft.client.renderer.chunk.SectionCompiler

信息

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

    TODO

字段/常量

  • ambientOcclusion

    • 类型: boolean
    • 修饰符: private final
    • 源码定位: L38
    • 说明:

      TODO

  • cutoutLeaves

    • 类型: boolean
    • 修饰符: private final
    • 源码定位: L39
    • 说明:

      TODO

  • blockModelSet

    • 类型: BlockStateModelSet
    • 修饰符: private final
    • 源码定位: L40
    • 说明:

      TODO

  • fluidModelSet

    • 类型: FluidStateModelSet
    • 修饰符: private final
    • 源码定位: L41
    • 说明:

      TODO

  • blockColors

    • 类型: BlockColors
    • 修饰符: private final
    • 源码定位: L42
    • 说明:

      TODO

  • blockEntityRenderer

    • 类型: BlockEntityRenderDispatcher
    • 修饰符: private final
    • 源码定位: L43
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.renderer.chunk.SectionCompiler.Results
    • 类型: class
    • 修饰符: public static final
    • 源码定位: L158
    • 说明:

      TODO

构造器

public SectionCompiler(boolean ambientOcclusion, boolean cutoutLeaves, BlockStateModelSet blockModelSet, FluidStateModelSet fluidModelSet, BlockColors blockColors, BlockEntityRenderDispatcher blockEntityRenderer) @ L45

  • 构造器名:SectionCompiler
  • 源码定位:L45
  • 修饰符:public

参数:

  • ambientOcclusion: boolean
  • cutoutLeaves: boolean
  • blockModelSet: BlockStateModelSet
  • fluidModelSet: FluidStateModelSet
  • blockColors: BlockColors
  • blockEntityRenderer: BlockEntityRenderDispatcher

说明:

TODO

方法

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

public SectionCompiler.Results compile(SectionPos sectionPos, RenderSectionRegion region, VertexSorting vertexSorting, SectionBufferBuilderPack builders) @ L61

  • 方法名:compile
  • 源码定位:L61
  • 返回类型:SectionCompiler.Results
  • 修饰符:public

参数:

  • sectionPos: SectionPos
  • region: RenderSectionRegion
  • vertexSorting: VertexSorting
  • builders: SectionBufferBuilderPack

说明:

TODO

private BufferBuilder getOrBeginLayer(Map<ChunkSectionLayer,BufferBuilder> startedLayers, SectionBufferBuilderPack buffers, ChunkSectionLayer layer) @ L139

  • 方法名:getOrBeginLayer
  • 源码定位:L139
  • 返回类型:BufferBuilder
  • 修饰符:private

参数:

  • startedLayers: Map<ChunkSectionLayer,BufferBuilder>
  • buffers: SectionBufferBuilderPack
  • layer: ChunkSectionLayer

说明:

TODO

private <E extends BlockEntity> void handleBlockEntity(SectionCompiler.Results results, E blockEntity) @ L150

  • 方法名:handleBlockEntity
  • 源码定位:L150
  • 返回类型: void
  • 修饰符:private

参数:

  • results: SectionCompiler.Results
  • blockEntity: E

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class SectionCompiler {
    private final boolean ambientOcclusion;
    private final boolean cutoutLeaves;
    private final BlockStateModelSet blockModelSet;
    private final FluidStateModelSet fluidModelSet;
    private final BlockColors blockColors;
    private final BlockEntityRenderDispatcher blockEntityRenderer;
 
    public SectionCompiler(
        boolean ambientOcclusion,
        boolean cutoutLeaves,
        BlockStateModelSet blockModelSet,
        FluidStateModelSet fluidModelSet,
        BlockColors blockColors,
        BlockEntityRenderDispatcher blockEntityRenderer
    ) {
        this.ambientOcclusion = ambientOcclusion;
        this.cutoutLeaves = cutoutLeaves;
        this.blockModelSet = blockModelSet;
        this.fluidModelSet = fluidModelSet;
        this.blockColors = blockColors;
        this.blockEntityRenderer = blockEntityRenderer;
    }
 
    public SectionCompiler.Results compile(SectionPos sectionPos, RenderSectionRegion region, VertexSorting vertexSorting, SectionBufferBuilderPack builders) {
        SectionCompiler.Results results = new SectionCompiler.Results();
        BlockPos minPos = sectionPos.origin();
        BlockPos maxPos = minPos.offset(15, 15, 15);
        VisGraph visGraph = new VisGraph();
        BlockModelLighter.enableCaching();
        ModelBlockRenderer blockRenderer = new ModelBlockRenderer(this.ambientOcclusion, true, this.blockColors);
        FluidRenderer fluidRenderer = new FluidRenderer(this.fluidModelSet);
        Map<ChunkSectionLayer, BufferBuilder> startedLayers = new EnumMap<>(ChunkSectionLayer.class);
        BlockQuadOutput quadOutput = (x, y, z, quad, instance) -> {
            BufferBuilder builder = this.getOrBeginLayer(startedLayers, builders, quad.materialInfo().layer());
            builder.putBlockBakedQuad(x, y, z, quad, instance);
        };
        BlockQuadOutput opaqueQuadOutput = (x, y, z, quad, instance) -> {
            BufferBuilder builder = this.getOrBeginLayer(startedLayers, builders, ChunkSectionLayer.SOLID);
            builder.putBlockBakedQuad(x, y, z, quad, instance);
        };
        FluidRenderer.Output fluidOutput = layerx -> this.getOrBeginLayer(startedLayers, builders, layerx);
 
        for (BlockPos pos : BlockPos.betweenClosed(minPos, maxPos)) {
            BlockState blockState = region.getBlockState(pos);
            if (!blockState.isAir()) {
                try {
                    if (blockState.isSolidRender()) {
                        visGraph.setOpaque(pos);
                    }
 
                    if (blockState.hasBlockEntity()) {
                        BlockEntity blockEntity = region.getBlockEntity(pos);
                        if (blockEntity != null) {
                            this.handleBlockEntity(results, blockEntity);
                        }
                    }
 
                    FluidState fluidState = blockState.getFluidState();
                    if (!fluidState.isEmpty()) {
                        fluidRenderer.tesselate(region, pos, fluidOutput, blockState, fluidState);
                    }
 
                    if (blockState.getRenderShape() == RenderShape.MODEL) {
                        blockRenderer.tesselateBlock(
                            ModelBlockRenderer.forceOpaque(this.cutoutLeaves, blockState) ? opaqueQuadOutput : quadOutput,
                            SectionPos.sectionRelative(pos.getX()),
                            SectionPos.sectionRelative(pos.getY()),
                            SectionPos.sectionRelative(pos.getZ()),
                            region,
                            pos,
                            blockState,
                            this.blockModelSet.get(blockState),
                            blockState.getSeed(pos)
                        );
                    }
                } catch (Throwable var21) {
                    CrashReport report = CrashReport.forThrowable(var21, "Tesselating block in world");
                    CrashReportCategory category = report.addCategory("Block being tesselated");
                    CrashReportCategory.populateBlockDetails(category, region, pos, blockState);
                    throw new ReportedException(report);
                }
            }
        }
 
        for (Entry<ChunkSectionLayer, BufferBuilder> entry : startedLayers.entrySet()) {
            ChunkSectionLayer layer = entry.getKey();
            MeshData mesh = entry.getValue().build();
            if (mesh != null) {
                if (layer == ChunkSectionLayer.TRANSLUCENT) {
                    results.transparencyState = mesh.sortQuads(builders.buffer(layer), vertexSorting);
                }
 
                results.renderedLayers.put(layer, mesh);
            }
        }
 
        BlockModelLighter.clearCache();
        results.visibilitySet = visGraph.resolve();
        return results;
    }
 
    private BufferBuilder getOrBeginLayer(Map<ChunkSectionLayer, BufferBuilder> startedLayers, SectionBufferBuilderPack buffers, ChunkSectionLayer layer) {
        BufferBuilder builder = startedLayers.get(layer);
        if (builder == null) {
            ByteBufferBuilder buffer = buffers.buffer(layer);
            builder = new BufferBuilder(buffer, VertexFormat.Mode.QUADS, layer.vertexFormat());
            startedLayers.put(layer, builder);
        }
 
        return builder;
    }
 
    private <E extends BlockEntity> void handleBlockEntity(SectionCompiler.Results results, E blockEntity) {
        BlockEntityRenderer<E, ?> renderer = this.blockEntityRenderer.getRenderer(blockEntity);
        if (renderer != null && !renderer.shouldRenderOffScreen()) {
            results.blockEntities.add(blockEntity);
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public static final class Results {
        public final List<BlockEntity> blockEntities = new ArrayList<>();
        public final Map<ChunkSectionLayer, MeshData> renderedLayers = new EnumMap<>(ChunkSectionLayer.class);
        public VisibilitySet visibilitySet = new VisibilitySet();
        public MeshData.@Nullable SortState transparencyState;
 
        public void release() {
            this.renderedLayers.values().forEach(MeshData::close);
        }
    }
}

引用的其他类