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.blockentity.BlockEntityRendererProvider.Context; 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, BlockEntityRenderer> renderers = ImmutableMap.of(); private final Font font; private final Supplier 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, 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 BlockEntityRenderer getRenderer(E blockEntity) { return (BlockEntityRenderer)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 void render(E blockEntity, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource) { BlockEntityRenderer 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 void setupAndRender( BlockEntityRenderer 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) { Context context = new Context( this, this.blockRenderDispatcher, this.itemModelResolver, this.itemRenderer, this.entityRenderer, (EntityModelSet)this.entityModelSet.get(), this.font ); this.renderers = BlockEntityRenderers.createEntityRenderers(context); } }