minecraft-src/net/minecraft/client/renderer/chunk/ChunkSectionsToRender.java
2025-09-18 12:27:44 +00:00

57 lines
2.4 KiB
Java

package net.minecraft.client.renderer.chunk;
import com.mojang.blaze3d.buffers.GpuBuffer;
import com.mojang.blaze3d.buffers.GpuBufferSlice;
import com.mojang.blaze3d.pipeline.RenderTarget;
import com.mojang.blaze3d.systems.RenderPass;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.VertexFormat;
import java.util.EnumMap;
import java.util.List;
import java.util.OptionalDouble;
import java.util.OptionalInt;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderPipelines;
@Environment(EnvType.CLIENT)
public record ChunkSectionsToRender(
EnumMap<ChunkSectionLayer, List<RenderPass.Draw<GpuBufferSlice[]>>> drawsPerLayer, int maxIndicesRequired, GpuBufferSlice[] dynamicTransforms
) {
public void renderGroup(ChunkSectionLayerGroup group) {
RenderSystem.AutoStorageIndexBuffer autoStorageIndexBuffer = RenderSystem.getSequentialBuffer(VertexFormat.Mode.QUADS);
GpuBuffer gpuBuffer = this.maxIndicesRequired == 0 ? null : autoStorageIndexBuffer.getBuffer(this.maxIndicesRequired);
VertexFormat.IndexType indexType = this.maxIndicesRequired == 0 ? null : autoStorageIndexBuffer.type();
ChunkSectionLayer[] chunkSectionLayers = group.layers();
Minecraft minecraft = Minecraft.getInstance();
boolean bl = false;
RenderTarget renderTarget = group.outputTarget();
try (RenderPass renderPass = RenderSystem.getDevice()
.createCommandEncoder()
.createRenderPass(
() -> "Section layers for " + group.label(),
renderTarget.getColorTextureView(),
OptionalInt.empty(),
renderTarget.getDepthTextureView(),
OptionalDouble.empty()
)) {
RenderSystem.bindDefaultUniforms(renderPass);
renderPass.bindSampler("Sampler2", minecraft.gameRenderer.lightTexture().getTextureView());
for (ChunkSectionLayer chunkSectionLayer : chunkSectionLayers) {
List<RenderPass.Draw<GpuBufferSlice[]>> list = (List<RenderPass.Draw<GpuBufferSlice[]>>)this.drawsPerLayer.get(chunkSectionLayer);
if (!list.isEmpty()) {
if (chunkSectionLayer == ChunkSectionLayer.TRANSLUCENT) {
list = list.reversed();
}
renderPass.setPipeline(bl ? RenderPipelines.WIREFRAME : chunkSectionLayer.pipeline());
renderPass.bindSampler("Sampler0", chunkSectionLayer.textureView());
renderPass.drawMultipleIndexed(list, gpuBuffer, indexType, List.of("DynamicTransforms"), this.dynamicTransforms);
}
}
}
}
}