Code/net/minecraft/client/renderer/blockentity/BannerRenderer.java

139 lines
6.4 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.client.renderer.blockentity;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import net.minecraft.client.model.BannerFlagModel;
import net.minecraft.client.model.BannerModel;
import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.model.geom.ModelLayers;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.Sheets;
import net.minecraft.client.resources.model.Material;
import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.core.BlockPos;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.level.block.BannerBlock;
import net.minecraft.world.level.block.WallBannerBlock;
import net.minecraft.world.level.block.entity.BannerBlockEntity;
import net.minecraft.world.level.block.entity.BannerPatternLayers;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.RotationSegment;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
public class BannerRenderer implements BlockEntityRenderer<BannerBlockEntity> {
private static final int MAX_PATTERNS = 16;
private static final float SIZE = 0.6666667F;
private final BannerModel standingModel;
private final BannerModel wallModel;
private final BannerFlagModel standingFlagModel;
private final BannerFlagModel wallFlagModel;
public BannerRenderer(BlockEntityRendererProvider.Context p_173521_) {
this(p_173521_.getModelSet());
}
public BannerRenderer(EntityModelSet p_375660_) {
this.standingModel = new BannerModel(p_375660_.bakeLayer(ModelLayers.STANDING_BANNER));
this.wallModel = new BannerModel(p_375660_.bakeLayer(ModelLayers.WALL_BANNER));
this.standingFlagModel = new BannerFlagModel(p_375660_.bakeLayer(ModelLayers.STANDING_BANNER_FLAG));
this.wallFlagModel = new BannerFlagModel(p_375660_.bakeLayer(ModelLayers.WALL_BANNER_FLAG));
}
public void render(
BannerBlockEntity p_112052_, float p_112053_, PoseStack p_112054_, MultiBufferSource p_112055_, int p_112056_, int p_112057_, Vec3 p_395980_
) {
BlockState blockstate = p_112052_.getBlockState();
BannerModel bannermodel;
BannerFlagModel bannerflagmodel;
float f;
if (blockstate.getBlock() instanceof BannerBlock) {
f = -RotationSegment.convertToDegrees(blockstate.getValue(BannerBlock.ROTATION));
bannermodel = this.standingModel;
bannerflagmodel = this.standingFlagModel;
} else {
f = -blockstate.getValue(WallBannerBlock.FACING).toYRot();
bannermodel = this.wallModel;
bannerflagmodel = this.wallFlagModel;
}
long i = p_112052_.getLevel().getGameTime();
BlockPos blockpos = p_112052_.getBlockPos();
float f1 = ((float)Math.floorMod(blockpos.getX() * 7 + blockpos.getY() * 9 + blockpos.getZ() * 13 + i, 100L) + p_112053_) / 100.0F;
renderBanner(p_112054_, p_112055_, p_112056_, p_112057_, f, bannermodel, bannerflagmodel, f1, p_112052_.getBaseColor(), p_112052_.getPatterns());
}
public void renderInHand(PoseStack p_378791_, MultiBufferSource p_377506_, int p_376325_, int p_376814_, DyeColor p_378689_, BannerPatternLayers p_376552_) {
renderBanner(p_378791_, p_377506_, p_376325_, p_376814_, 0.0F, this.standingModel, this.standingFlagModel, 0.0F, p_378689_, p_376552_);
}
private static void renderBanner(
PoseStack p_375890_,
MultiBufferSource p_378479_,
int p_378067_,
int p_375649_,
float p_376968_,
BannerModel p_376125_,
BannerFlagModel p_375614_,
float p_376731_,
DyeColor p_378557_,
BannerPatternLayers p_377307_
) {
p_375890_.pushPose();
p_375890_.translate(0.5F, 0.0F, 0.5F);
p_375890_.mulPose(Axis.YP.rotationDegrees(p_376968_));
p_375890_.scale(0.6666667F, -0.6666667F, -0.6666667F);
p_376125_.renderToBuffer(p_375890_, ModelBakery.BANNER_BASE.buffer(p_378479_, RenderType::entitySolid), p_378067_, p_375649_);
p_375614_.setupAnim(p_376731_);
renderPatterns(p_375890_, p_378479_, p_378067_, p_375649_, p_375614_.root(), ModelBakery.BANNER_BASE, true, p_378557_, p_377307_);
p_375890_.popPose();
}
public static void renderPatterns(
PoseStack p_112066_,
MultiBufferSource p_112067_,
int p_112068_,
int p_112069_,
ModelPart p_112070_,
Material p_112071_,
boolean p_112072_,
DyeColor p_331835_,
BannerPatternLayers p_327702_
) {
renderPatterns(p_112066_, p_112067_, p_112068_, p_112069_, p_112070_, p_112071_, p_112072_, p_331835_, p_327702_, false, true);
}
public static void renderPatterns(
PoseStack p_112075_,
MultiBufferSource p_112076_,
int p_112077_,
int p_112078_,
ModelPart p_112079_,
Material p_112080_,
boolean p_112081_,
DyeColor p_336347_,
BannerPatternLayers p_332113_,
boolean p_112083_,
boolean p_361895_
) {
p_112079_.render(p_112075_, p_112080_.buffer(p_112076_, RenderType::entitySolid, p_361895_, p_112083_), p_112077_, p_112078_);
renderPatternLayer(p_112075_, p_112076_, p_112077_, p_112078_, p_112079_, p_112081_ ? Sheets.BANNER_BASE : Sheets.SHIELD_BASE, p_336347_);
for (int i = 0; i < 16 && i < p_332113_.layers().size(); i++) {
BannerPatternLayers.Layer bannerpatternlayers$layer = p_332113_.layers().get(i);
Material material = p_112081_ ? Sheets.getBannerMaterial(bannerpatternlayers$layer.pattern()) : Sheets.getShieldMaterial(bannerpatternlayers$layer.pattern());
renderPatternLayer(p_112075_, p_112076_, p_112077_, p_112078_, p_112079_, material, bannerpatternlayers$layer.color());
}
}
private static void renderPatternLayer(
PoseStack p_332210_, MultiBufferSource p_336119_, int p_333952_, int p_335632_, ModelPart p_327937_, Material p_327979_, DyeColor p_331652_
) {
int i = p_331652_.getTextureDiffuseColor();
p_327937_.render(p_332210_, p_327979_.buffer(p_336119_, RenderType::entityNoOutline), p_333952_, p_335632_, i);
}
}