EquipmentLayerRenderer.java

net.minecraft.client.renderer.entity.layers.EquipmentLayerRenderer

信息

  • 全限定名:net.minecraft.client.renderer.entity.layers.EquipmentLayerRenderer
  • 类型:public class
  • 包:net.minecraft.client.renderer.entity.layers
  • 源码路径:src/main/java/net/minecraft/client/renderer/entity/layers/EquipmentLayerRenderer.java
  • 起始行号:L31
  • 职责:

    TODO

字段/常量

  • NO_LAYER_COLOR

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L32
    • 说明:

      TODO

  • equipmentAssets

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

      TODO

  • layerTextureLookup

    • 类型: Function<EquipmentLayerRenderer.LayerTextureKey,Identifier>
    • 修饰符: private final
    • 源码定位: L34
    • 说明:

      TODO

  • trimSpriteLookup

    • 类型: Function<EquipmentLayerRenderer.TrimSpriteKey,TextureAtlasSprite>
    • 修饰符: private final
    • 源码定位: L35
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.renderer.entity.layers.EquipmentLayerRenderer.LayerTextureKey

    • 类型: record
    • 修饰符: private
    • 源码定位: L136
    • 说明:

      TODO

  • net.minecraft.client.renderer.entity.layers.EquipmentLayerRenderer.TrimSpriteKey

    • 类型: record
    • 修饰符: private
    • 源码定位: L140
    • 说明:

      TODO

构造器

public EquipmentLayerRenderer(EquipmentAssetManager equipmentAssets, TextureAtlas armorTrimAtlas) @ L37

  • 构造器名:EquipmentLayerRenderer
  • 源码定位:L37
  • 修饰符:public

参数:

  • equipmentAssets: EquipmentAssetManager
  • armorTrimAtlas: TextureAtlas

说明:

TODO

方法

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

public <S> void renderLayers(EquipmentClientInfo.LayerType layerType, ResourceKey<EquipmentAsset> equipmentAssetId, Model<?super S> model, S state, ItemStack itemStack, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, int outlineColor) @ L43

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

参数:

  • layerType: EquipmentClientInfo.LayerType
  • equipmentAssetId: ResourceKey
  • model: Model<?super S>
  • state: S
  • itemStack: ItemStack
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • lightCoords: int
  • outlineColor: int

说明:

TODO

public <S> void renderLayers(EquipmentClientInfo.LayerType layerType, ResourceKey<EquipmentAsset> equipmentAssetId, Model<?super S> model, S state, ItemStack itemStack, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, Identifier playerTextureOverride, int outlineColor, int order) @ L57

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

参数:

  • layerType: EquipmentClientInfo.LayerType
  • equipmentAssetId: ResourceKey
  • model: Model<?super S>
  • state: S
  • itemStack: ItemStack
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • lightCoords: int
  • playerTextureOverride: Identifier
  • outlineColor: int
  • order: int

说明:

TODO

private static int getColorForLayer(EquipmentClientInfo.Layer layer, int dyeColor) @ L125

  • 方法名:getColorForLayer
  • 源码定位:L125
  • 返回类型:int
  • 修饰符:private static

参数:

  • layer: EquipmentClientInfo.Layer
  • dyeColor: int

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class EquipmentLayerRenderer {
    private static final int NO_LAYER_COLOR = 0;
    private final EquipmentAssetManager equipmentAssets;
    private final Function<EquipmentLayerRenderer.LayerTextureKey, Identifier> layerTextureLookup;
    private final Function<EquipmentLayerRenderer.TrimSpriteKey, TextureAtlasSprite> trimSpriteLookup;
 
    public EquipmentLayerRenderer(EquipmentAssetManager equipmentAssets, TextureAtlas armorTrimAtlas) {
        this.equipmentAssets = equipmentAssets;
        this.layerTextureLookup = Util.memoize(key -> key.layer.getTextureLocation(key.layerType));
        this.trimSpriteLookup = Util.memoize(key -> armorTrimAtlas.getSprite(key.spriteId()));
    }
 
    public <S> void renderLayers(
        EquipmentClientInfo.LayerType layerType,
        ResourceKey<EquipmentAsset> equipmentAssetId,
        Model<? super S> model,
        S state,
        ItemStack itemStack,
        PoseStack poseStack,
        SubmitNodeCollector submitNodeCollector,
        int lightCoords,
        int outlineColor
    ) {
        this.renderLayers(layerType, equipmentAssetId, model, state, itemStack, poseStack, submitNodeCollector, lightCoords, null, outlineColor, 1);
    }
 
    public <S> void renderLayers(
        EquipmentClientInfo.LayerType layerType,
        ResourceKey<EquipmentAsset> equipmentAssetId,
        Model<? super S> model,
        S state,
        ItemStack itemStack,
        PoseStack poseStack,
        SubmitNodeCollector submitNodeCollector,
        int lightCoords,
        @Nullable Identifier playerTextureOverride,
        int outlineColor,
        int order
    ) {
        List<EquipmentClientInfo.Layer> layers = this.equipmentAssets.get(equipmentAssetId).getLayers(layerType);
        if (!layers.isEmpty()) {
            int dyeColor = DyedItemColor.getOrDefault(itemStack, 0);
            boolean renderFoil = itemStack.hasFoil();
            int nextOrder = order;
 
            for (EquipmentClientInfo.Layer layer : layers) {
                int color = getColorForLayer(layer, dyeColor);
                if (color != 0) {
                    Identifier layerTexture = layer.usePlayerTexture() && playerTextureOverride != null
                        ? playerTextureOverride
                        : this.layerTextureLookup.apply(new EquipmentLayerRenderer.LayerTextureKey(layerType, layer));
                    submitNodeCollector.order(nextOrder++)
                        .submitModel(
                            model,
                            state,
                            poseStack,
                            RenderTypes.armorCutoutNoCull(layerTexture),
                            lightCoords,
                            OverlayTexture.NO_OVERLAY,
                            color,
                            null,
                            outlineColor,
                            null
                        );
                    if (renderFoil) {
                        submitNodeCollector.order(nextOrder++)
                            .submitModel(
                                model,
                                state,
                                poseStack,
                                RenderTypes.armorEntityGlint(),
                                lightCoords,
                                OverlayTexture.NO_OVERLAY,
                                color,
                                null,
                                outlineColor,
                                null
                            );
                    }
 
                    renderFoil = false;
                }
            }
 
            ArmorTrim trim = itemStack.get(DataComponents.TRIM);
            if (trim != null && layerType != EquipmentClientInfo.LayerType.HUMANOID_BABY) {
                TextureAtlasSprite sprite = this.trimSpriteLookup.apply(new EquipmentLayerRenderer.TrimSpriteKey(trim, layerType, equipmentAssetId));
                RenderType renderType = Sheets.armorTrimsSheet(trim.pattern().value().decal());
                submitNodeCollector.order(nextOrder++)
                    .submitModel(model, state, poseStack, renderType, lightCoords, OverlayTexture.NO_OVERLAY, -1, sprite, outlineColor, null);
            }
        }
    }
 
    private static int getColorForLayer(EquipmentClientInfo.Layer layer, int dyeColor) {
        Optional<EquipmentClientInfo.Dyeable> dyeable = layer.dyeable();
        if (dyeable.isPresent()) {
            int colorWhenUndyed = dyeable.get().colorWhenUndyed().map(ARGB::opaque).orElse(0);
            return dyeColor != 0 ? dyeColor : colorWhenUndyed;
        } else {
            return -1;
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    private record LayerTextureKey(EquipmentClientInfo.LayerType layerType, EquipmentClientInfo.Layer layer) {
    }
 
    @OnlyIn(Dist.CLIENT)
    private record TrimSpriteKey(ArmorTrim trim, EquipmentClientInfo.LayerType layerType, ResourceKey<EquipmentAsset> equipmentAssetId) {
        public Identifier spriteId() {
            return this.trim.layerAssetId(this.layerType.trimAssetPrefix(), this.equipmentAssetId);
        }
    }
}

引用的其他类