minecraft-src/net/minecraft/client/renderer/blockentity/BlockEntityRenderDispatcher.java
2025-07-04 03:45:38 +03:00

121 lines
4.7 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.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<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) {
Context context = new Context(
this, this.blockRenderDispatcher, this.itemModelResolver, this.itemRenderer, this.entityRenderer, (EntityModelSet)this.entityModelSet.get(), this.font
);
this.renderers = BlockEntityRenderers.createEntityRenderers(context);
}
}