EntityRenderDispatcher.java

net.minecraft.client.renderer.entity.EntityRenderDispatcher

信息

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

    TODO

字段/常量

  • renderers

    • 类型: Map<EntityType<?>,EntityRenderer<?,?>>
    • 修饰符: private
    • 源码定位: L47
    • 说明:

      TODO

  • playerRenderers

    • 类型: Map<PlayerModelType,AvatarRenderer<AbstractClientPlayer>>
    • 修饰符: private
    • 源码定位: L48
    • 说明:

      TODO

  • mannequinRenderers

    • 类型: Map<PlayerModelType,AvatarRenderer<ClientMannequin>>
    • 修饰符: private
    • 源码定位: L49
    • 说明:

      TODO

  • textureManager

    • 类型: TextureManager
    • 修饰符: public final
    • 源码定位: L50
    • 说明:

      TODO

  • camera

    • 类型: Camera
    • 修饰符: public
    • 源码定位: L51
    • 说明:

      TODO

  • crosshairPickEntity

    • 类型: Entity
    • 修饰符: public
    • 源码定位: L52
    • 说明:

      TODO

  • blockModelResolver

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

      TODO

  • itemModelResolver

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

      TODO

  • mapRenderer

    • 类型: MapRenderer
    • 修饰符: private final
    • 源码定位: L55
    • 说明:

      TODO

  • itemInHandRenderer

    • 类型: ItemInHandRenderer
    • 修饰符: private final
    • 源码定位: L56
    • 说明:

      TODO

  • atlasManager

    • 类型: AtlasManager
    • 修饰符: private final
    • 源码定位: L57
    • 说明:

      TODO

  • font

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

      TODO

  • options

    • 类型: Options
    • 修饰符: public final
    • 源码定位: L59
    • 说明:

      TODO

  • entityModels

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

      TODO

  • equipmentAssets

    • 类型: EquipmentAssetManager
    • 修饰符: private final
    • 源码定位: L61
    • 说明:

      TODO

  • playerSkinRenderCache

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

      TODO

内部类/嵌套类型

构造器

public EntityRenderDispatcher(Minecraft minecraft, TextureManager textureManager, BlockModelResolver blockModelResolver, ItemModelResolver itemModelResolver, MapRenderer mapRenderer, AtlasManager atlasManager, Font font, Options options, Supplier<EntityModelSet> entityModels, EquipmentAssetManager equipmentAssets, PlayerSkinRenderCache playerSkinRenderCache) @ L68

  • 构造器名:EntityRenderDispatcher
  • 源码定位:L68
  • 修饰符:public

参数:

  • minecraft: Minecraft
  • textureManager: TextureManager
  • blockModelResolver: BlockModelResolver
  • itemModelResolver: ItemModelResolver
  • mapRenderer: MapRenderer
  • atlasManager: AtlasManager
  • font: Font
  • options: Options
  • entityModels: Supplier
  • equipmentAssets: EquipmentAssetManager
  • playerSkinRenderCache: PlayerSkinRenderCache

说明:

TODO

方法

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

public <E extends Entity> int getPackedLightCoords(E entity, float partialTickTime) @ L64

  • 方法名:getPackedLightCoords
  • 源码定位:L64
  • 返回类型: int
  • 修饰符:public

参数:

  • entity: E
  • partialTickTime: float

说明:

TODO

public <T extends Entity> EntityRenderer<?super T,?> getRenderer(T entity) @ L94

  • 方法名:getRenderer
  • 源码定位:L94
  • 返回类型: EntityRenderer
  • 修饰符:public

参数:

  • entity: T

说明:

TODO

public AvatarRenderer<AbstractClientPlayer> getPlayerRenderer(AbstractClientPlayer player) @ L102

  • 方法名:getPlayerRenderer
  • 源码定位:L102
  • 返回类型:AvatarRenderer
  • 修饰符:public

参数:

  • player: AbstractClientPlayer

说明:

TODO

private <T extends Avatar &ClientAvatarEntity> AvatarRenderer<T> getAvatarRenderer(Map<PlayerModelType,AvatarRenderer<T>> renderers, T entity) @ L106

  • 方法名:getAvatarRenderer
  • 源码定位:L106
  • 返回类型:<T extends Avatar &ClientAvatarEntity> AvatarRenderer
  • 修饰符:private

参数:

  • renderers: Map<PlayerModelType,AvatarRenderer>
  • entity: T

说明:

TODO

public <S extends EntityRenderState> EntityRenderer<?,?super S> getRenderer(S entityRenderState) @ L112

  • 方法名:getRenderer
  • 源码定位:L112
  • 返回类型: EntityRenderer<?,?super S>
  • 修饰符:public

参数:

  • entityRenderState: S

说明:

TODO

public void prepare(Camera camera, Entity crosshairPickEntity) @ L122

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

参数:

  • camera: Camera
  • crosshairPickEntity: Entity

说明:

TODO

public <E extends Entity> boolean shouldRender(E entity, Frustum culler, double camX, double camY, double camZ) @ L127

  • 方法名:shouldRender
  • 源码定位:L127
  • 返回类型: boolean
  • 修饰符:public

参数:

  • entity: E
  • culler: Frustum
  • camX: double
  • camY: double
  • camZ: double

说明:

TODO

public <E extends Entity> EntityRenderState extractEntity(E entity, float partialTicks) @ L132

  • 方法名:extractEntity
  • 源码定位:L132
  • 返回类型: EntityRenderState
  • 修饰符:public

参数:

  • entity: E
  • partialTicks: float

说明:

TODO

public <S extends EntityRenderState> void submit(S renderState, CameraRenderState camera, double x, double y, double z, PoseStack poseStack, SubmitNodeCollector submitNodeCollector) @ L147

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

参数:

  • renderState: S
  • camera: CameraRenderState
  • x: double
  • y: double
  • z: double
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector

说明:

TODO

private <S extends EntityRenderState> CrashReportCategory fillRendererDetails(EntityRenderer<?,S> renderer, CrashReport report) @ L186

  • 方法名:fillRendererDetails
  • 源码定位:L186
  • 返回类型: CrashReportCategory
  • 修饰符:private

参数:

  • renderer: EntityRenderer<?,S>
  • report: CrashReport

说明:

TODO

public void resetCamera() @ L192

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

参数:

说明:

TODO

public double distanceToSqr(Entity entity) @ L196

  • 方法名:distanceToSqr
  • 源码定位:L196
  • 返回类型:double
  • 修饰符:public

参数:

  • entity: Entity

说明:

TODO

public ItemInHandRenderer getItemInHandRenderer() @ L200

  • 方法名:getItemInHandRenderer
  • 源码定位:L200
  • 返回类型:ItemInHandRenderer
  • 修饰符:public

参数:

说明:

TODO

public void onResourceManagerReload(ResourceManager resourceManager) @ L204

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

参数:

  • resourceManager: ResourceManager

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class EntityRenderDispatcher implements ResourceManagerReloadListener {
    private Map<EntityType<?>, EntityRenderer<?, ?>> renderers = ImmutableMap.of();
    private Map<PlayerModelType, AvatarRenderer<AbstractClientPlayer>> playerRenderers = Map.of();
    private Map<PlayerModelType, AvatarRenderer<ClientMannequin>> mannequinRenderers = Map.of();
    public final TextureManager textureManager;
    public @Nullable Camera camera;
    public Entity crosshairPickEntity;
    private final BlockModelResolver blockModelResolver;
    private final ItemModelResolver itemModelResolver;
    private final MapRenderer mapRenderer;
    private final ItemInHandRenderer itemInHandRenderer;
    private final AtlasManager atlasManager;
    private final Font font;
    public final Options options;
    private final Supplier<EntityModelSet> entityModels;
    private final EquipmentAssetManager equipmentAssets;
    private final PlayerSkinRenderCache playerSkinRenderCache;
 
    public <E extends Entity> int getPackedLightCoords(E entity, float partialTickTime) {
        return this.getRenderer(entity).getPackedLightCoords(entity, partialTickTime);
    }
 
    public EntityRenderDispatcher(
        Minecraft minecraft,
        TextureManager textureManager,
        BlockModelResolver blockModelResolver,
        ItemModelResolver itemModelResolver,
        MapRenderer mapRenderer,
        AtlasManager atlasManager,
        Font font,
        Options options,
        Supplier<EntityModelSet> entityModels,
        EquipmentAssetManager equipmentAssets,
        PlayerSkinRenderCache playerSkinRenderCache
    ) {
        this.textureManager = textureManager;
        this.blockModelResolver = blockModelResolver;
        this.itemModelResolver = itemModelResolver;
        this.mapRenderer = mapRenderer;
        this.atlasManager = atlasManager;
        this.playerSkinRenderCache = playerSkinRenderCache;
        this.itemInHandRenderer = new ItemInHandRenderer(minecraft, this, itemModelResolver);
        this.font = font;
        this.options = options;
        this.entityModels = entityModels;
        this.equipmentAssets = equipmentAssets;
    }
 
    public <T extends Entity> EntityRenderer<? super T, ?> getRenderer(T entity) {
        return (EntityRenderer<? super T, ?>)(switch (entity) {
            case AbstractClientPlayer player -> this.getAvatarRenderer(this.playerRenderers, player);
            case ClientMannequin mannequin -> this.getAvatarRenderer(this.mannequinRenderers, mannequin);
            default -> (EntityRenderer)this.renderers.get(entity.getType());
        });
    }
 
    public AvatarRenderer<AbstractClientPlayer> getPlayerRenderer(AbstractClientPlayer player) {
        return this.getAvatarRenderer(this.playerRenderers, player);
    }
 
    private <T extends Avatar & ClientAvatarEntity> AvatarRenderer<T> getAvatarRenderer(Map<PlayerModelType, AvatarRenderer<T>> renderers, T entity) {
        PlayerModelType model = entity.getSkin().model();
        AvatarRenderer<T> playerRenderer = renderers.get(model);
        return playerRenderer != null ? playerRenderer : renderers.get(PlayerModelType.WIDE);
    }
 
    public <S extends EntityRenderState> EntityRenderer<?, ? super S> getRenderer(S entityRenderState) {
        if (entityRenderState instanceof AvatarRenderState player) {
            PlayerModelType model = player.skin.model();
            EntityRenderer<? extends Avatar, ?> playerRenderer = (EntityRenderer<? extends Avatar, ?>)this.playerRenderers.get(model);
            return (EntityRenderer<?, ? super S>)(playerRenderer != null ? playerRenderer : (EntityRenderer)this.playerRenderers.get(PlayerModelType.WIDE));
        } else {
            return (EntityRenderer<?, ? super S>)this.renderers.get(entityRenderState.entityType);
        }
    }
 
    public void prepare(Camera camera, Entity crosshairPickEntity) {
        this.camera = camera;
        this.crosshairPickEntity = crosshairPickEntity;
    }
 
    public <E extends Entity> boolean shouldRender(E entity, Frustum culler, double camX, double camY, double camZ) {
        EntityRenderer<? super E, ?> renderer = this.getRenderer(entity);
        return renderer.shouldRender(entity, culler, camX, camY, camZ);
    }
 
    public <E extends Entity> EntityRenderState extractEntity(E entity, float partialTicks) {
        EntityRenderer<? super E, ?> renderer = this.getRenderer(entity);
 
        try {
            return renderer.createRenderState(entity, partialTicks);
        } catch (Throwable var8) {
            CrashReport report = CrashReport.forThrowable(var8, "Extracting render state for an entity in world");
            CrashReportCategory entityCat = report.addCategory("Entity being extracted");
            entity.fillCrashReportCategory(entityCat);
            CrashReportCategory rendererCategory = this.fillRendererDetails(renderer, report);
            rendererCategory.setDetail("Delta", partialTicks);
            throw new ReportedException(report);
        }
    }
 
    public <S extends EntityRenderState> void submit(
        S renderState, CameraRenderState camera, double x, double y, double z, PoseStack poseStack, SubmitNodeCollector submitNodeCollector
    ) {
        EntityRenderer<?, ? super S> renderer = this.getRenderer(renderState);
 
        try {
            Vec3 pos = renderer.getRenderOffset(renderState);
            double relativeX = x + pos.x();
            double relativeY = y + pos.y();
            double relativeZ = z + pos.z();
            poseStack.pushPose();
            poseStack.translate(relativeX, relativeY, relativeZ);
            renderer.submit(renderState, poseStack, submitNodeCollector, camera);
            if (renderState.displayFireAnimation) {
                submitNodeCollector.submitFlame(poseStack, renderState, Mth.rotationAroundAxis(Mth.Y_AXIS, camera.orientation, new Quaternionf()));
            }
 
            if (renderState instanceof AvatarRenderState) {
                poseStack.translate(-pos.x(), -pos.y(), -pos.z());
            }
 
            if (!renderState.shadowPieces.isEmpty()) {
                submitNodeCollector.submitShadow(poseStack, renderState.shadowRadius, renderState.shadowPieces);
            }
 
            if (!(renderState instanceof AvatarRenderState)) {
                poseStack.translate(-pos.x(), -pos.y(), -pos.z());
            }
 
            poseStack.popPose();
        } catch (Throwable var19) {
            CrashReport report = CrashReport.forThrowable(var19, "Rendering entity in world");
            CrashReportCategory entityCat = report.addCategory("EntityRenderState being rendered");
            renderState.fillCrashReportCategory(entityCat);
            this.fillRendererDetails(renderer, report);
            throw new ReportedException(report);
        }
    }
 
    private <S extends EntityRenderState> CrashReportCategory fillRendererDetails(EntityRenderer<?, S> renderer, CrashReport report) {
        CrashReportCategory category = report.addCategory("Renderer details");
        category.setDetail("Assigned renderer", renderer);
        return category;
    }
 
    public void resetCamera() {
        this.camera = null;
    }
 
    public double distanceToSqr(Entity entity) {
        return this.camera.position().distanceToSqr(entity.position());
    }
 
    public ItemInHandRenderer getItemInHandRenderer() {
        return this.itemInHandRenderer;
    }
 
    @Override
    public void onResourceManagerReload(ResourceManager resourceManager) {
        EntityRendererProvider.Context context = new EntityRendererProvider.Context(
            this,
            this.blockModelResolver,
            this.itemModelResolver,
            this.mapRenderer,
            resourceManager,
            this.entityModels.get(),
            this.equipmentAssets,
            this.atlasManager,
            this.font,
            this.playerSkinRenderCache
        );
        this.renderers = EntityRenderers.createEntityRenderers(context);
        this.playerRenderers = EntityRenderers.createAvatarRenderers(context);
        this.mannequinRenderers = EntityRenderers.createAvatarRenderers(context);
    }
}

引用的其他类