BannerRenderer.java

net.minecraft.client.renderer.blockentity.BannerRenderer

信息

  • 全限定名:net.minecraft.client.renderer.blockentity.BannerRenderer
  • 类型:public class
  • 包:net.minecraft.client.renderer.blockentity
  • 源码路径:src/main/java/net/minecraft/client/renderer/blockentity/BannerRenderer.java
  • 起始行号:L40
  • 实现:BlockEntityRenderer<BannerBlockEntity,BannerRenderState>
  • 职责:

    TODO

字段/常量

  • MAX_PATTERNS

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

      TODO

  • SIZE

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

      TODO

  • MODEL_SCALE

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

      TODO

  • MODEL_TRANSLATION

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

      TODO

  • TRANSFORMATIONS

    • 类型: WallAndGroundTransformations<Transformation>
    • 修饰符: public static final
    • 源码定位: L45
    • 说明:

      TODO

  • sprites

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

      TODO

  • standingModel

    • 类型: BannerModel
    • 修饰符: private final
    • 源码定位: L49
    • 说明:

      TODO

  • wallModel

    • 类型: BannerModel
    • 修饰符: private final
    • 源码定位: L50
    • 说明:

      TODO

  • standingFlagModel

    • 类型: BannerFlagModel
    • 修饰符: private final
    • 源码定位: L51
    • 说明:

      TODO

  • wallFlagModel

    • 类型: BannerFlagModel
    • 修饰符: private final
    • 源码定位: L52
    • 说明:

      TODO

内部类/嵌套类型

构造器

public BannerRenderer(BlockEntityRendererProvider.Context context) @ L54

  • 构造器名:BannerRenderer
  • 源码定位:L54
  • 修饰符:public

参数:

  • context: BlockEntityRendererProvider.Context

说明:

TODO

public BannerRenderer(SpecialModelRenderer.BakingContext context) @ L58

  • 构造器名:BannerRenderer
  • 源码定位:L58
  • 修饰符:public

参数:

  • context: SpecialModelRenderer.BakingContext

说明:

TODO

public BannerRenderer(EntityModelSet modelSet, SpriteGetter sprites) @ L62

  • 构造器名:BannerRenderer
  • 源码定位:L62
  • 修饰符:public

参数:

  • modelSet: EntityModelSet
  • sprites: SpriteGetter

说明:

TODO

方法

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

public BannerRenderState createRenderState() @ L70

  • 方法名:createRenderState
  • 源码定位:L70
  • 返回类型:BannerRenderState
  • 修饰符:public

参数:

说明:

TODO

public void extractRenderState(BannerBlockEntity blockEntity, BannerRenderState state, float partialTicks, Vec3 cameraPosition, ModelFeatureRenderer.CrumblingOverlay breakProgress) @ L74

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

参数:

  • blockEntity: BannerBlockEntity
  • state: BannerRenderState
  • partialTicks: float
  • cameraPosition: Vec3
  • breakProgress: ModelFeatureRenderer.CrumblingOverlay

说明:

TODO

private BannerModel bannerModel(BannerBlock.AttachmentType type) @ L98

  • 方法名:bannerModel
  • 源码定位:L98
  • 返回类型:BannerModel
  • 修饰符:private

参数:

  • type: BannerBlock.AttachmentType

说明:

TODO

private BannerFlagModel flagModel(BannerBlock.AttachmentType type) @ L105

  • 方法名:flagModel
  • 源码定位:L105
  • 返回类型:BannerFlagModel
  • 修饰符:private

参数:

  • type: BannerBlock.AttachmentType

说明:

TODO

public void submit(BannerRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) @ L112

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

参数:

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

说明:

TODO

public void submitSpecial(BannerBlock.AttachmentType type, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, int overlayCoords, DyeColor baseColor, BannerPatternLayers patterns, int outlineColor) @ L132

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

参数:

  • type: BannerBlock.AttachmentType
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • lightCoords: int
  • overlayCoords: int
  • baseColor: DyeColor
  • patterns: BannerPatternLayers
  • outlineColor: int

说明:

TODO

private static void submitBanner(SpriteGetter sprites, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, int overlayCoords, BannerModel model, BannerFlagModel flagModel, float phase, DyeColor baseColor, BannerPatternLayers patterns, ModelFeatureRenderer.CrumblingOverlay breakProgress, int outlineColor) @ L158

  • 方法名:submitBanner
  • 源码定位:L158
  • 返回类型:void
  • 修饰符:private static

参数:

  • sprites: SpriteGetter
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • lightCoords: int
  • overlayCoords: int
  • model: BannerModel
  • flagModel: BannerFlagModel
  • phase: float
  • baseColor: DyeColor
  • patterns: BannerPatternLayers
  • breakProgress: ModelFeatureRenderer.CrumblingOverlay
  • outlineColor: int

说明:

TODO

public static <S> void submitPatterns(SpriteGetter sprites, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, int overlayCoords, Model<S> model, S state, boolean banner, DyeColor baseColor, BannerPatternLayers patterns, ModelFeatureRenderer.CrumblingOverlay breakProgress) @ L178

  • 方法名:submitPatterns
  • 源码定位:L178
  • 返回类型: void
  • 修饰符:public static

参数:

  • sprites: SpriteGetter
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • lightCoords: int
  • overlayCoords: int
  • model: Model
  • state: S
  • banner: boolean
  • baseColor: DyeColor
  • patterns: BannerPatternLayers
  • breakProgress: ModelFeatureRenderer.CrumblingOverlay

说明:

TODO

private static <S> void submitPatternLayer(SpriteGetter sprites, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, int overlayCoords, Model<S> model, S state, SpriteId sprite, DyeColor color, ModelFeatureRenderer.CrumblingOverlay breakProgress) @ L211

  • 方法名:submitPatternLayer
  • 源码定位:L211
  • 返回类型: void
  • 修饰符:private static

参数:

  • sprites: SpriteGetter
  • poseStack: PoseStack
  • submitNodeCollector: SubmitNodeCollector
  • lightCoords: int
  • overlayCoords: int
  • model: Model
  • state: S
  • sprite: SpriteId
  • color: DyeColor
  • breakProgress: ModelFeatureRenderer.CrumblingOverlay

说明:

TODO

public void getExtents(Consumer<Vector3fc> output) @ L238

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

参数:

  • output: Consumer

说明:

TODO

private static Transformation modelTransformation(float angle) @ L245

  • 方法名:modelTransformation
  • 源码定位:L245
  • 返回类型:Transformation
  • 修饰符:private static

参数:

  • angle: float

说明:

TODO

private static Transformation createGroundTransformation(int segment) @ L249

  • 方法名:createGroundTransformation
  • 源码定位:L249
  • 返回类型:Transformation
  • 修饰符:private static

参数:

  • segment: int

说明:

TODO

private static Transformation createWallTransformation(Direction direction) @ L253

  • 方法名:createWallTransformation
  • 源码定位:L253
  • 返回类型:Transformation
  • 修饰符:private static

参数:

  • direction: Direction

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class BannerRenderer implements BlockEntityRenderer<BannerBlockEntity, BannerRenderState> {
    private static final int MAX_PATTERNS = 16;
    private static final float SIZE = 0.6666667F;
    private static final Vector3fc MODEL_SCALE = new Vector3f(0.6666667F, -0.6666667F, -0.6666667F);
    private static final Vector3fc MODEL_TRANSLATION = new Vector3f(0.5F, 0.0F, 0.5F);
    public static final WallAndGroundTransformations<Transformation> TRANSFORMATIONS = new WallAndGroundTransformations<>(
        BannerRenderer::createWallTransformation, BannerRenderer::createGroundTransformation, 16
    );
    private final SpriteGetter sprites;
    private final BannerModel standingModel;
    private final BannerModel wallModel;
    private final BannerFlagModel standingFlagModel;
    private final BannerFlagModel wallFlagModel;
 
    public BannerRenderer(BlockEntityRendererProvider.Context context) {
        this(context.entityModelSet(), context.sprites());
    }
 
    public BannerRenderer(SpecialModelRenderer.BakingContext context) {
        this(context.entityModelSet(), context.sprites());
    }
 
    public BannerRenderer(EntityModelSet modelSet, SpriteGetter sprites) {
        this.sprites = sprites;
        this.standingModel = new BannerModel(modelSet.bakeLayer(ModelLayers.STANDING_BANNER));
        this.wallModel = new BannerModel(modelSet.bakeLayer(ModelLayers.WALL_BANNER));
        this.standingFlagModel = new BannerFlagModel(modelSet.bakeLayer(ModelLayers.STANDING_BANNER_FLAG));
        this.wallFlagModel = new BannerFlagModel(modelSet.bakeLayer(ModelLayers.WALL_BANNER_FLAG));
    }
 
    public BannerRenderState createRenderState() {
        return new BannerRenderState();
    }
 
    public void extractRenderState(
        BannerBlockEntity blockEntity,
        BannerRenderState state,
        float partialTicks,
        Vec3 cameraPosition,
        ModelFeatureRenderer.@Nullable CrumblingOverlay breakProgress
    ) {
        BlockEntityRenderer.super.extractRenderState(blockEntity, state, partialTicks, cameraPosition, breakProgress);
        state.baseColor = blockEntity.getBaseColor();
        state.patterns = blockEntity.getPatterns();
        BlockState blockState = blockEntity.getBlockState();
        if (blockState.getBlock() instanceof BannerBlock) {
            state.transformation = TRANSFORMATIONS.freeTransformations(blockState.getValue(BannerBlock.ROTATION));
            state.attachmentType = BannerBlock.AttachmentType.GROUND;
        } else {
            state.transformation = TRANSFORMATIONS.wallTransformation(blockState.getValue(WallBannerBlock.FACING));
            state.attachmentType = BannerBlock.AttachmentType.WALL;
        }
 
        long gameTime = blockEntity.getLevel() != null ? blockEntity.getLevel().getGameTime() : 0L;
        BlockPos blockPos = blockEntity.getBlockPos();
        state.phase = ((float)Math.floorMod(blockPos.getX() * 7 + blockPos.getY() * 9 + blockPos.getZ() * 13 + gameTime, 100L) + partialTicks) / 100.0F;
    }
 
    private BannerModel bannerModel(BannerBlock.AttachmentType type) {
        return switch (type) {
            case WALL -> this.wallModel;
            case GROUND -> this.standingModel;
        };
    }
 
    private BannerFlagModel flagModel(BannerBlock.AttachmentType type) {
        return switch (type) {
            case WALL -> this.wallFlagModel;
            case GROUND -> this.standingFlagModel;
        };
    }
 
    public void submit(BannerRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) {
        poseStack.pushPose();
        poseStack.mulPose(state.transformation);
        submitBanner(
            this.sprites,
            poseStack,
            submitNodeCollector,
            state.lightCoords,
            OverlayTexture.NO_OVERLAY,
            this.bannerModel(state.attachmentType),
            this.flagModel(state.attachmentType),
            state.phase,
            state.baseColor,
            state.patterns,
            state.breakProgress,
            0
        );
        poseStack.popPose();
    }
 
    public void submitSpecial(
        BannerBlock.AttachmentType type,
        PoseStack poseStack,
        SubmitNodeCollector submitNodeCollector,
        int lightCoords,
        int overlayCoords,
        DyeColor baseColor,
        BannerPatternLayers patterns,
        int outlineColor
    ) {
        submitBanner(
            this.sprites,
            poseStack,
            submitNodeCollector,
            lightCoords,
            overlayCoords,
            this.bannerModel(type),
            this.flagModel(type),
            0.0F,
            baseColor,
            patterns,
            null,
            outlineColor
        );
    }
 
    private static void submitBanner(
        SpriteGetter sprites,
        PoseStack poseStack,
        SubmitNodeCollector submitNodeCollector,
        int lightCoords,
        int overlayCoords,
        BannerModel model,
        BannerFlagModel flagModel,
        float phase,
        DyeColor baseColor,
        BannerPatternLayers patterns,
        ModelFeatureRenderer.@Nullable CrumblingOverlay breakProgress,
        int outlineColor
    ) {
        SpriteId sprite = Sheets.BANNER_BASE;
        submitNodeCollector.submitModel(model, Unit.INSTANCE, poseStack, lightCoords, overlayCoords, -1, sprite, sprites, outlineColor, breakProgress);
        submitNodeCollector.submitModel(flagModel, phase, poseStack, lightCoords, overlayCoords, -1, sprite, sprites, outlineColor, breakProgress);
        submitPatterns(sprites, poseStack, submitNodeCollector, lightCoords, overlayCoords, flagModel, phase, true, baseColor, patterns, breakProgress);
    }
 
    public static <S> void submitPatterns(
        SpriteGetter sprites,
        PoseStack poseStack,
        SubmitNodeCollector submitNodeCollector,
        int lightCoords,
        int overlayCoords,
        Model<S> model,
        S state,
        boolean banner,
        DyeColor baseColor,
        BannerPatternLayers patterns,
        ModelFeatureRenderer.@Nullable CrumblingOverlay breakProgress
    ) {
        submitPatternLayer(
            sprites,
            poseStack,
            submitNodeCollector,
            lightCoords,
            overlayCoords,
            model,
            state,
            banner ? Sheets.BANNER_PATTERN_BASE : Sheets.SHIELD_PATTERN_BASE,
            baseColor,
            breakProgress
        );
 
        for (int maskIndex = 0; maskIndex < 16 && maskIndex < patterns.layers().size(); maskIndex++) {
            BannerPatternLayers.Layer layer = patterns.layers().get(maskIndex);
            SpriteId sprite = banner ? Sheets.getBannerSprite(layer.pattern()) : Sheets.getShieldSprite(layer.pattern());
            submitPatternLayer(sprites, poseStack, submitNodeCollector, lightCoords, overlayCoords, model, state, sprite, layer.color(), null);
        }
    }
 
    private static <S> void submitPatternLayer(
        SpriteGetter sprites,
        PoseStack poseStack,
        SubmitNodeCollector submitNodeCollector,
        int lightCoords,
        int overlayCoords,
        Model<S> model,
        S state,
        SpriteId sprite,
        DyeColor color,
        ModelFeatureRenderer.@Nullable CrumblingOverlay breakProgress
    ) {
        int diffuseColor = color.getTextureDiffuseColor();
        submitNodeCollector.submitModel(
            model,
            state,
            poseStack,
            sprite.renderType(RenderTypes::bannerPattern),
            lightCoords,
            overlayCoords,
            diffuseColor,
            sprites.get(sprite),
            0,
            breakProgress
        );
    }
 
    public void getExtents(Consumer<Vector3fc> output) {
        PoseStack poseStack = new PoseStack();
        this.standingModel.root().getExtentsForGui(poseStack, output);
        this.standingFlagModel.setupAnim(0.0F);
        this.standingFlagModel.root().getExtentsForGui(poseStack, output);
    }
 
    private static Transformation modelTransformation(float angle) {
        return new Transformation(MODEL_TRANSLATION, Axis.YP.rotationDegrees(-angle), MODEL_SCALE, null);
    }
 
    private static Transformation createGroundTransformation(int segment) {
        return modelTransformation(RotationSegment.convertToDegrees(segment));
    }
 
    private static Transformation createWallTransformation(Direction direction) {
        return modelTransformation(direction.toYRot());
    }
}

引用的其他类