120 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.client.renderer.blockentity;
 | |
| 
 | |
| import com.google.common.collect.ImmutableMap;
 | |
| import com.mojang.blaze3d.vertex.PoseStack;
 | |
| import java.util.Map;
 | |
| 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.Camera;
 | |
| import net.minecraft.client.gui.Font;
 | |
| import net.minecraft.client.model.geom.EntityModelSet;
 | |
| import net.minecraft.client.renderer.LevelRenderer;
 | |
| import net.minecraft.client.renderer.MultiBufferSource;
 | |
| import net.minecraft.client.renderer.block.BlockRenderDispatcher;
 | |
| import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
 | |
| import net.minecraft.client.renderer.entity.ItemRenderer;
 | |
| import net.minecraft.client.renderer.item.ItemModelResolver;
 | |
| import net.minecraft.client.renderer.texture.OverlayTexture;
 | |
| import net.minecraft.server.packs.resources.ResourceManager;
 | |
| import net.minecraft.server.packs.resources.ResourceManagerReloadListener;
 | |
| import net.minecraft.world.level.Level;
 | |
| import net.minecraft.world.level.block.entity.BlockEntity;
 | |
| import net.minecraft.world.level.block.entity.BlockEntityType;
 | |
| import net.minecraft.world.phys.HitResult;
 | |
| import net.minecraft.world.phys.Vec3;
 | |
| import org.jetbrains.annotations.Nullable;
 | |
| 
 | |
| @Environment(EnvType.CLIENT)
 | |
| public class BlockEntityRenderDispatcher implements ResourceManagerReloadListener {
 | |
| 	private Map<BlockEntityType<?>, BlockEntityRenderer<?>> renderers = ImmutableMap.of();
 | |
| 	private final Font font;
 | |
| 	private final Supplier<EntityModelSet> entityModelSet;
 | |
| 	public Level level;
 | |
| 	public Camera camera;
 | |
| 	public HitResult cameraHitResult;
 | |
| 	private final BlockRenderDispatcher blockRenderDispatcher;
 | |
| 	private final ItemModelResolver itemModelResolver;
 | |
| 	private final ItemRenderer itemRenderer;
 | |
| 	private final EntityRenderDispatcher entityRenderer;
 | |
| 
 | |
| 	public BlockEntityRenderDispatcher(
 | |
| 		Font font,
 | |
| 		Supplier<EntityModelSet> entityModelSet,
 | |
| 		BlockRenderDispatcher blockRenderDispatcher,
 | |
| 		ItemModelResolver itemModelResolver,
 | |
| 		ItemRenderer itemRenderer,
 | |
| 		EntityRenderDispatcher entityRenderer
 | |
| 	) {
 | |
| 		this.itemRenderer = itemRenderer;
 | |
| 		this.itemModelResolver = itemModelResolver;
 | |
| 		this.entityRenderer = entityRenderer;
 | |
| 		this.font = font;
 | |
| 		this.entityModelSet = entityModelSet;
 | |
| 		this.blockRenderDispatcher = blockRenderDispatcher;
 | |
| 	}
 | |
| 
 | |
| 	@Nullable
 | |
| 	public <E extends BlockEntity> BlockEntityRenderer<E> getRenderer(E blockEntity) {
 | |
| 		return (BlockEntityRenderer<E>)this.renderers.get(blockEntity.getType());
 | |
| 	}
 | |
| 
 | |
| 	public void prepare(Level level, Camera camera, HitResult cameraHitResult) {
 | |
| 		if (this.level != level) {
 | |
| 			this.setLevel(level);
 | |
| 		}
 | |
| 
 | |
| 		this.camera = camera;
 | |
| 		this.cameraHitResult = cameraHitResult;
 | |
| 	}
 | |
| 
 | |
| 	public <E extends BlockEntity> void render(E blockEntity, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource) {
 | |
| 		BlockEntityRenderer<E> blockEntityRenderer = this.getRenderer(blockEntity);
 | |
| 		if (blockEntityRenderer != null) {
 | |
| 			if (blockEntity.hasLevel() && blockEntity.getType().isValid(blockEntity.getBlockState())) {
 | |
| 				if (blockEntityRenderer.shouldRender(blockEntity, this.camera.getPosition())) {
 | |
| 					try {
 | |
| 						setupAndRender(blockEntityRenderer, blockEntity, partialTick, poseStack, bufferSource, this.camera.getPosition());
 | |
| 					} catch (Throwable var9) {
 | |
| 						CrashReport crashReport = CrashReport.forThrowable(var9, "Rendering Block Entity");
 | |
| 						CrashReportCategory crashReportCategory = crashReport.addCategory("Block Entity Details");
 | |
| 						blockEntity.fillCrashReportCategory(crashReportCategory);
 | |
| 						throw new ReportedException(crashReport);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private static <T extends BlockEntity> void setupAndRender(
 | |
| 		BlockEntityRenderer<T> renderer, T blockEntity, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, Vec3 cameraPos
 | |
| 	) {
 | |
| 		Level level = blockEntity.getLevel();
 | |
| 		int i;
 | |
| 		if (level != null) {
 | |
| 			i = LevelRenderer.getLightColor(level, blockEntity.getBlockPos());
 | |
| 		} else {
 | |
| 			i = 15728880;
 | |
| 		}
 | |
| 
 | |
| 		renderer.render(blockEntity, partialTick, poseStack, bufferSource, i, OverlayTexture.NO_OVERLAY, cameraPos);
 | |
| 	}
 | |
| 
 | |
| 	public void setLevel(@Nullable Level level) {
 | |
| 		this.level = level;
 | |
| 		if (level == null) {
 | |
| 			this.camera = null;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public void onResourceManagerReload(ResourceManager resourceManager) {
 | |
| 		BlockEntityRendererProvider.Context context = new BlockEntityRendererProvider.Context(
 | |
| 			this, this.blockRenderDispatcher, this.itemModelResolver, this.itemRenderer, this.entityRenderer, (EntityModelSet)this.entityModelSet.get(), this.font
 | |
| 		);
 | |
| 		this.renderers = BlockEntityRenderers.createEntityRenderers(context);
 | |
| 	}
 | |
| }
 |