114 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.client.renderer.block;
 | |
| 
 | |
| import com.mojang.blaze3d.vertex.PoseStack;
 | |
| import com.mojang.blaze3d.vertex.VertexConsumer;
 | |
| import java.util.ArrayList;
 | |
| import java.util.List;
 | |
| import java.util.function.Supplier;
 | |
| import net.fabricmc.api.EnvType;
 | |
| import net.fabricmc.api.Environment;
 | |
| import net.minecraft.CrashReport;
 | |
| import net.minecraft.CrashReportCategory;
 | |
| import net.minecraft.ReportedException;
 | |
| import net.minecraft.client.color.block.BlockColors;
 | |
| import net.minecraft.client.renderer.ItemBlockRenderTypes;
 | |
| import net.minecraft.client.renderer.MultiBufferSource;
 | |
| import net.minecraft.client.renderer.SpecialBlockModelRenderer;
 | |
| import net.minecraft.client.renderer.block.model.BlockModelPart;
 | |
| import net.minecraft.client.renderer.block.model.BlockStateModel;
 | |
| import net.minecraft.client.renderer.texture.OverlayTexture;
 | |
| import net.minecraft.core.BlockPos;
 | |
| import net.minecraft.server.packs.resources.ResourceManager;
 | |
| import net.minecraft.server.packs.resources.ResourceManagerReloadListener;
 | |
| import net.minecraft.util.RandomSource;
 | |
| import net.minecraft.world.item.ItemDisplayContext;
 | |
| import net.minecraft.world.level.BlockAndTintGetter;
 | |
| import net.minecraft.world.level.block.RenderShape;
 | |
| import net.minecraft.world.level.block.state.BlockState;
 | |
| import net.minecraft.world.level.material.FluidState;
 | |
| 
 | |
| @Environment(EnvType.CLIENT)
 | |
| public class BlockRenderDispatcher implements ResourceManagerReloadListener {
 | |
| 	private final BlockModelShaper blockModelShaper;
 | |
| 	private final ModelBlockRenderer modelRenderer;
 | |
| 	private final Supplier<SpecialBlockModelRenderer> specialBlockModelRenderer;
 | |
| 	private final LiquidBlockRenderer liquidBlockRenderer;
 | |
| 	private final RandomSource singleThreadRandom = RandomSource.create();
 | |
| 	private final List<BlockModelPart> singleThreadPartList = new ArrayList();
 | |
| 	private final BlockColors blockColors;
 | |
| 
 | |
| 	public BlockRenderDispatcher(BlockModelShaper blockModelShaper, Supplier<SpecialBlockModelRenderer> specialBlockModelRenderer, BlockColors blockColors) {
 | |
| 		this.blockModelShaper = blockModelShaper;
 | |
| 		this.specialBlockModelRenderer = specialBlockModelRenderer;
 | |
| 		this.blockColors = blockColors;
 | |
| 		this.modelRenderer = new ModelBlockRenderer(this.blockColors);
 | |
| 		this.liquidBlockRenderer = new LiquidBlockRenderer();
 | |
| 	}
 | |
| 
 | |
| 	public BlockModelShaper getBlockModelShaper() {
 | |
| 		return this.blockModelShaper;
 | |
| 	}
 | |
| 
 | |
| 	public void renderBreakingTexture(BlockState state, BlockPos pos, BlockAndTintGetter level, PoseStack poseStack, VertexConsumer consumer) {
 | |
| 		if (state.getRenderShape() == RenderShape.MODEL) {
 | |
| 			BlockStateModel blockStateModel = this.blockModelShaper.getBlockModel(state);
 | |
| 			this.singleThreadRandom.setSeed(state.getSeed(pos));
 | |
| 			this.singleThreadPartList.clear();
 | |
| 			blockStateModel.collectParts(this.singleThreadRandom, this.singleThreadPartList);
 | |
| 			this.modelRenderer.tesselateBlock(level, this.singleThreadPartList, state, pos, poseStack, consumer, true, OverlayTexture.NO_OVERLAY);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void renderBatched(
 | |
| 		BlockState state, BlockPos pos, BlockAndTintGetter level, PoseStack poseStack, VertexConsumer consumer, boolean checkSides, List<BlockModelPart> parts
 | |
| 	) {
 | |
| 		try {
 | |
| 			this.modelRenderer.tesselateBlock(level, parts, state, pos, poseStack, consumer, checkSides, OverlayTexture.NO_OVERLAY);
 | |
| 		} catch (Throwable var11) {
 | |
| 			CrashReport crashReport = CrashReport.forThrowable(var11, "Tesselating block in world");
 | |
| 			CrashReportCategory crashReportCategory = crashReport.addCategory("Block being tesselated");
 | |
| 			CrashReportCategory.populateBlockDetails(crashReportCategory, level, pos, state);
 | |
| 			throw new ReportedException(crashReport);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void renderLiquid(BlockPos pos, BlockAndTintGetter level, VertexConsumer consumer, BlockState blockState, FluidState fluidState) {
 | |
| 		try {
 | |
| 			this.liquidBlockRenderer.tesselate(level, pos, consumer, blockState, fluidState);
 | |
| 		} catch (Throwable var9) {
 | |
| 			CrashReport crashReport = CrashReport.forThrowable(var9, "Tesselating liquid in world");
 | |
| 			CrashReportCategory crashReportCategory = crashReport.addCategory("Block being tesselated");
 | |
| 			CrashReportCategory.populateBlockDetails(crashReportCategory, level, pos, blockState);
 | |
| 			throw new ReportedException(crashReport);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public ModelBlockRenderer getModelRenderer() {
 | |
| 		return this.modelRenderer;
 | |
| 	}
 | |
| 
 | |
| 	public BlockStateModel getBlockModel(BlockState state) {
 | |
| 		return this.blockModelShaper.getBlockModel(state);
 | |
| 	}
 | |
| 
 | |
| 	public void renderSingleBlock(BlockState state, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay) {
 | |
| 		RenderShape renderShape = state.getRenderShape();
 | |
| 		if (renderShape != RenderShape.INVISIBLE) {
 | |
| 			BlockStateModel blockStateModel = this.getBlockModel(state);
 | |
| 			int i = this.blockColors.getColor(state, null, null, 0);
 | |
| 			float f = (i >> 16 & 0xFF) / 255.0F;
 | |
| 			float g = (i >> 8 & 0xFF) / 255.0F;
 | |
| 			float h = (i & 0xFF) / 255.0F;
 | |
| 			ModelBlockRenderer.renderModel(
 | |
| 				poseStack.last(), bufferSource.getBuffer(ItemBlockRenderTypes.getRenderType(state)), blockStateModel, f, g, h, packedLight, packedOverlay
 | |
| 			);
 | |
| 			((SpecialBlockModelRenderer)this.specialBlockModelRenderer.get())
 | |
| 				.renderByBlock(state.getBlock(), ItemDisplayContext.NONE, poseStack, bufferSource, packedLight, packedOverlay);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public void onResourceManagerReload(ResourceManager resourceManager) {
 | |
| 		this.liquidBlockRenderer.setupSprites();
 | |
| 	}
 | |
| }
 |