121 lines
4.7 KiB
Java
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);
|
|
}
|
|
}
|