Code/net/minecraft/client/renderer/blockentity/BlockEntityRenderDispatcher...

120 lines
5.1 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
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 javax.annotation.Nullable;
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 net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.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 p_234432_,
Supplier<EntityModelSet> p_234434_,
BlockRenderDispatcher p_377332_,
ItemModelResolver p_376400_,
ItemRenderer p_378208_,
EntityRenderDispatcher p_375551_
) {
this.itemRenderer = p_378208_;
this.itemModelResolver = p_376400_;
this.entityRenderer = p_375551_;
this.font = p_234432_;
this.entityModelSet = p_234434_;
this.blockRenderDispatcher = p_377332_;
}
@Nullable
public <E extends BlockEntity> BlockEntityRenderer<E> getRenderer(E p_112266_) {
return (BlockEntityRenderer<E>)this.renderers.get(p_112266_.getType());
}
public void prepare(Level p_173565_, Camera p_173566_, HitResult p_173567_) {
if (this.level != p_173565_) {
this.setLevel(p_173565_);
}
this.camera = p_173566_;
this.cameraHitResult = p_173567_;
}
public <E extends BlockEntity> void render(E p_112268_, float p_112269_, PoseStack p_112270_, MultiBufferSource p_112271_) {
BlockEntityRenderer<E> blockentityrenderer = this.getRenderer(p_112268_);
if (blockentityrenderer != null) {
if (p_112268_.hasLevel() && p_112268_.getType().isValid(p_112268_.getBlockState())) {
if (blockentityrenderer.shouldRender(p_112268_, this.camera.getPosition())) {
try {
setupAndRender(blockentityrenderer, p_112268_, p_112269_, p_112270_, p_112271_, this.camera.getPosition());
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.forThrowable(throwable, "Rendering Block Entity");
CrashReportCategory crashreportcategory = crashreport.addCategory("Block Entity Details");
p_112268_.fillCrashReportCategory(crashreportcategory);
throw new ReportedException(crashreport);
}
}
}
}
}
private static <T extends BlockEntity> void setupAndRender(
BlockEntityRenderer<T> p_112285_, T p_112286_, float p_112287_, PoseStack p_112288_, MultiBufferSource p_112289_, Vec3 p_394103_
) {
Level level = p_112286_.getLevel();
int i;
if (level != null) {
i = LevelRenderer.getLightColor(level, p_112286_.getBlockPos());
} else {
i = 15728880;
}
p_112285_.render(p_112286_, p_112287_, p_112288_, p_112289_, i, OverlayTexture.NO_OVERLAY, p_394103_);
}
public void setLevel(@Nullable Level p_112258_) {
this.level = p_112258_;
if (p_112258_ == null) {
this.camera = null;
}
}
@Override
public void onResourceManagerReload(ResourceManager p_173563_) {
BlockEntityRendererProvider.Context blockentityrendererprovider$context = new BlockEntityRendererProvider.Context(
this, this.blockRenderDispatcher, this.itemModelResolver, this.itemRenderer, this.entityRenderer, this.entityModelSet.get(), this.font
);
this.renderers = BlockEntityRenderers.createEntityRenderers(blockentityrendererprovider$context);
}
}