BlockEntityRenderDispatcher.java

net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher

信息

  • 全限定名:net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher
  • 类型:public class
  • 包:net.minecraft.client.renderer.blockentity
  • 源码路径:src/main/java/net/minecraft/client/renderer/blockentity/BlockEntityRenderDispatcher.java
  • 起始行号:L31
  • 实现:ResourceManagerReloadListener
  • 职责:

    TODO

字段/常量

  • renderers

    • 类型: Map<BlockEntityType<?>,BlockEntityRenderer<?,?>>
    • 修饰符: private
    • 源码定位: L32
    • 说明:

      TODO

  • font

    • 类型: Font
    • 修饰符: private final
    • 源码定位: L33
    • 说明:

      TODO

  • entityModelSet

    • 类型: Supplier<EntityModelSet>
    • 修饰符: private final
    • 源码定位: L34
    • 说明:

      TODO

  • cameraPos

    • 类型: Vec3
    • 修饰符: private
    • 源码定位: L35
    • 说明:

      TODO

  • blockModelResolver

    • 类型: BlockModelResolver
    • 修饰符: private final
    • 源码定位: L36
    • 说明:

      TODO

  • itemModelResolver

    • 类型: ItemModelResolver
    • 修饰符: private final
    • 源码定位: L37
    • 说明:

      TODO

  • entityRenderer

    • 类型: EntityRenderDispatcher
    • 修饰符: private final
    • 源码定位: L38
    • 说明:

      TODO

  • sprites

    • 类型: SpriteGetter
    • 修饰符: private final
    • 源码定位: L39
    • 说明:

      TODO

  • playerSkinRenderCache

    • 类型: PlayerSkinRenderCache
    • 修饰符: private final
    • 源码定位: L40
    • 说明:

      TODO

内部类/嵌套类型

构造器

public BlockEntityRenderDispatcher(Font font, Supplier<EntityModelSet> entityModelSet, BlockModelResolver blockModelResolver, ItemModelResolver itemModelResolver, EntityRenderDispatcher entityRenderer, SpriteGetter sprites, PlayerSkinRenderCache playerSkinRenderCache) @ L42

  • 构造器名:BlockEntityRenderDispatcher
  • 源码定位:L42
  • 修饰符:public

参数:

  • font: Font
  • entityModelSet: Supplier
  • blockModelResolver: BlockModelResolver
  • itemModelResolver: ItemModelResolver
  • entityRenderer: EntityRenderDispatcher
  • sprites: SpriteGetter
  • playerSkinRenderCache: PlayerSkinRenderCache

说明:

TODO

方法

下面的方法块按源码顺序生成。

public <E extends BlockEntity,S extends BlockEntityRenderState> BlockEntityRenderer<E,S> getRenderer(E blockEntity) @ L60

  • 方法名:getRenderer
  • 源码定位:L60
  • 返回类型:<E extends BlockEntity,S extends BlockEntityRenderState> BlockEntityRenderer<E,S>
  • 修饰符:public

参数:

  • blockEntity: E

说明:

TODO

public <E extends BlockEntity,S extends BlockEntityRenderState> BlockEntityRenderer<E,S> getRenderer(S state) @ L64

  • 方法名:getRenderer
  • 源码定位:L64
  • 返回类型:<E extends BlockEntity,S extends BlockEntityRenderState> BlockEntityRenderer<E,S>
  • 修饰符:public

参数:

  • state: S

说明:

TODO

public void prepare(Vec3 cameraPos) @ L68

  • 方法名:prepare
  • 源码定位:L68
  • 返回类型:void
  • 修饰符:public

参数:

  • cameraPos: Vec3

说明:

TODO

public <E extends BlockEntity,S extends BlockEntityRenderState> S tryExtractRenderState(E blockEntity, float partialTicks, ModelFeatureRenderer.CrumblingOverlay breakProgress) @ L72

  • 方法名:tryExtractRenderState
  • 源码定位:L72
  • 返回类型:<E extends BlockEntity,S extends BlockEntityRenderState> S
  • 修饰符:public

参数:

  • blockEntity: E
  • partialTicks: float
  • breakProgress: ModelFeatureRenderer.CrumblingOverlay

说明:

TODO

public <S extends BlockEntityRenderState> void submit(S state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) @ L90

  • 方法名:submit
  • 源码定位:L90
  • 返回类型: void
  • 修饰符:public

参数:

  • state: S
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • camera: CameraRenderState

说明:

TODO

public void onResourceManagerReload(ResourceManager resourceManager) @ L104

  • 方法名:onResourceManagerReload
  • 源码定位:L104
  • 返回类型:void
  • 修饰符:public

参数:

  • resourceManager: ResourceManager

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class BlockEntityRenderDispatcher implements ResourceManagerReloadListener {
    private Map<BlockEntityType<?>, BlockEntityRenderer<?, ?>> renderers = ImmutableMap.of();
    private final Font font;
    private final Supplier<EntityModelSet> entityModelSet;
    private Vec3 cameraPos;
    private final BlockModelResolver blockModelResolver;
    private final ItemModelResolver itemModelResolver;
    private final EntityRenderDispatcher entityRenderer;
    private final SpriteGetter sprites;
    private final PlayerSkinRenderCache playerSkinRenderCache;
 
    public BlockEntityRenderDispatcher(
        Font font,
        Supplier<EntityModelSet> entityModelSet,
        BlockModelResolver blockModelResolver,
        ItemModelResolver itemModelResolver,
        EntityRenderDispatcher entityRenderer,
        SpriteGetter sprites,
        PlayerSkinRenderCache playerSkinRenderCache
    ) {
        this.blockModelResolver = blockModelResolver;
        this.itemModelResolver = itemModelResolver;
        this.entityRenderer = entityRenderer;
        this.font = font;
        this.entityModelSet = entityModelSet;
        this.sprites = sprites;
        this.playerSkinRenderCache = playerSkinRenderCache;
    }
 
    public <E extends BlockEntity, S extends BlockEntityRenderState> @Nullable BlockEntityRenderer<E, S> getRenderer(E blockEntity) {
        return (BlockEntityRenderer<E, S>)this.renderers.get(blockEntity.getType());
    }
 
    public <E extends BlockEntity, S extends BlockEntityRenderState> @Nullable BlockEntityRenderer<E, S> getRenderer(S state) {
        return (BlockEntityRenderer<E, S>)this.renderers.get(state.blockEntityType);
    }
 
    public void prepare(Vec3 cameraPos) {
        this.cameraPos = cameraPos;
    }
 
    public <E extends BlockEntity, S extends BlockEntityRenderState> @Nullable S tryExtractRenderState(
        E blockEntity, float partialTicks, ModelFeatureRenderer.@Nullable CrumblingOverlay breakProgress
    ) {
        BlockEntityRenderer<E, S> renderer = this.getRenderer(blockEntity);
        if (renderer == null) {
            return null;
        } else if (!blockEntity.hasLevel() || !blockEntity.getType().isValid(blockEntity.getBlockState())) {
            return null;
        } else if (!renderer.shouldRender(blockEntity, this.cameraPos)) {
            return null;
        } else {
            Vec3 cameraPosition = this.cameraPos;
            S state = renderer.createRenderState();
            renderer.extractRenderState(blockEntity, state, partialTicks, cameraPosition, breakProgress);
            return state;
        }
    }
 
    public <S extends BlockEntityRenderState> void submit(S state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) {
        BlockEntityRenderer<?, S> renderer = this.getRenderer(state);
        if (renderer != null) {
            try {
                renderer.submit(state, poseStack, submitNodeCollector, camera);
            } catch (Throwable var9) {
                CrashReport report = CrashReport.forThrowable(var9, "Rendering Block Entity");
                CrashReportCategory category = report.addCategory("Block Entity Details");
                state.fillCrashReportCategory(category);
                throw new ReportedException(report);
            }
        }
    }
 
    @Override
    public void onResourceManagerReload(ResourceManager resourceManager) {
        BlockEntityRendererProvider.Context context = new BlockEntityRendererProvider.Context(
            this,
            this.blockModelResolver,
            this.itemModelResolver,
            this.entityRenderer,
            this.entityModelSet.get(),
            this.font,
            this.sprites,
            this.playerSkinRenderCache
        );
        this.renderers = BlockEntityRenderers.createEntityRenderers(context);
    }
}

引用的其他类