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);
}
}
}引用的其他类
-
- 引用位置:
参数/构造调用/返回值 - 关联成员:
BufferBuilder()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
CrashReport.forThrowable()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
CrashReportCategory.populateBlockDetails()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
ReportedException()
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
BlockModelLighter.clearCache(), BlockModelLighter.enableCaching()
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
FluidRenderer()
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
方法调用/构造调用 - 关联成员:
ModelBlockRenderer(), ModelBlockRenderer.forceOpaque()
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
VisGraph()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
VisibilitySet()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
BlockPos.betweenClosed()
- 引用位置:
-
- 引用位置:
参数/方法调用 - 关联成员:
SectionPos.sectionRelative()
- 引用位置:
-
- 引用位置:
返回值
- 引用位置: