Code/net/minecraft/client/renderer/entity/ItemFrameRenderer.java

153 lines
6.9 KiB
Java

package net.minecraft.client.renderer.entity;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MapRenderer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.client.renderer.block.model.BlockStateModel;
import net.minecraft.client.renderer.entity.state.ItemFrameRenderState;
import net.minecraft.client.renderer.item.ItemModelResolver;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.resources.model.BlockStateDefinitions;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.decoration.ItemFrame;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.saveddata.maps.MapId;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
public class ItemFrameRenderer<T extends ItemFrame> extends EntityRenderer<T, ItemFrameRenderState> {
public static final int GLOW_FRAME_BRIGHTNESS = 5;
public static final int BRIGHT_MAP_LIGHT_ADJUSTMENT = 30;
private final ItemModelResolver itemModelResolver;
private final MapRenderer mapRenderer;
private final BlockRenderDispatcher blockRenderer;
public ItemFrameRenderer(EntityRendererProvider.Context p_174204_) {
super(p_174204_);
this.itemModelResolver = p_174204_.getItemModelResolver();
this.mapRenderer = p_174204_.getMapRenderer();
this.blockRenderer = p_174204_.getBlockRenderDispatcher();
}
protected int getBlockLightLevel(T p_174216_, BlockPos p_174217_) {
return p_174216_.getType() == EntityType.GLOW_ITEM_FRAME ? Math.max(5, super.getBlockLightLevel(p_174216_, p_174217_)) : super.getBlockLightLevel(p_174216_, p_174217_);
}
public void render(ItemFrameRenderState p_361692_, PoseStack p_115061_, MultiBufferSource p_115062_, int p_115063_) {
super.render(p_361692_, p_115061_, p_115062_, p_115063_);
p_115061_.pushPose();
Direction direction = p_361692_.direction;
Vec3 vec3 = this.getRenderOffset(p_361692_);
p_115061_.translate(-vec3.x(), -vec3.y(), -vec3.z());
double d0 = 0.46875;
p_115061_.translate(direction.getStepX() * 0.46875, direction.getStepY() * 0.46875, direction.getStepZ() * 0.46875);
float f;
float f1;
if (direction.getAxis().isHorizontal()) {
f = 0.0F;
f1 = 180.0F - direction.toYRot();
} else {
f = -90 * direction.getAxisDirection().getStep();
f1 = 180.0F;
}
p_115061_.mulPose(Axis.XP.rotationDegrees(f));
p_115061_.mulPose(Axis.YP.rotationDegrees(f1));
if (!p_361692_.isInvisible) {
BlockState blockstate = BlockStateDefinitions.getItemFrameFakeState(p_361692_.isGlowFrame, p_361692_.mapId != null);
BlockStateModel blockstatemodel = this.blockRenderer.getBlockModel(blockstate);
p_115061_.pushPose();
p_115061_.translate(-0.5F, -0.5F, -0.5F);
ModelBlockRenderer.renderModel(
p_115061_.last(),
p_115062_.getBuffer(RenderType.entitySolidZOffsetForward(TextureAtlas.LOCATION_BLOCKS)),
blockstatemodel,
1.0F,
1.0F,
1.0F,
p_115063_,
OverlayTexture.NO_OVERLAY
);
p_115061_.popPose();
}
if (p_361692_.isInvisible) {
p_115061_.translate(0.0F, 0.0F, 0.5F);
} else {
p_115061_.translate(0.0F, 0.0F, 0.4375F);
}
if (p_361692_.mapId != null) {
int j = p_361692_.rotation % 4 * 2;
p_115061_.mulPose(Axis.ZP.rotationDegrees(j * 360.0F / 8.0F));
p_115061_.mulPose(Axis.ZP.rotationDegrees(180.0F));
float f2 = 0.0078125F;
p_115061_.scale(0.0078125F, 0.0078125F, 0.0078125F);
p_115061_.translate(-64.0F, -64.0F, 0.0F);
p_115061_.translate(0.0F, 0.0F, -1.0F);
int i = this.getLightCoords(p_361692_.isGlowFrame, 15728850, p_115063_);
this.mapRenderer.render(p_361692_.mapRenderState, p_115061_, p_115062_, true, i);
} else if (!p_361692_.item.isEmpty()) {
p_115061_.mulPose(Axis.ZP.rotationDegrees(p_361692_.rotation * 360.0F / 8.0F));
int k = this.getLightCoords(p_361692_.isGlowFrame, 15728880, p_115063_);
p_115061_.scale(0.5F, 0.5F, 0.5F);
p_361692_.item.render(p_115061_, p_115062_, k, OverlayTexture.NO_OVERLAY);
}
p_115061_.popPose();
}
private int getLightCoords(boolean p_368253_, int p_174210_, int p_174211_) {
return p_368253_ ? p_174210_ : p_174211_;
}
public Vec3 getRenderOffset(ItemFrameRenderState p_368370_) {
return new Vec3(p_368370_.direction.getStepX() * 0.3F, -0.25, p_368370_.direction.getStepZ() * 0.3F);
}
protected boolean shouldShowName(T p_115091_, double p_366137_) {
return Minecraft.renderNames() && this.entityRenderDispatcher.crosshairPickEntity == p_115091_ && p_115091_.getItem().getCustomName() != null;
}
protected Component getNameTag(T p_364863_) {
return p_364863_.getItem().getHoverName();
}
public ItemFrameRenderState createRenderState() {
return new ItemFrameRenderState();
}
public void extractRenderState(T p_369136_, ItemFrameRenderState p_364469_, float p_366511_) {
super.extractRenderState(p_369136_, p_364469_, p_366511_);
p_364469_.direction = p_369136_.getDirection();
ItemStack itemstack = p_369136_.getItem();
this.itemModelResolver.updateForNonLiving(p_364469_.item, itemstack, ItemDisplayContext.FIXED, p_369136_);
p_364469_.rotation = p_369136_.getRotation();
p_364469_.isGlowFrame = p_369136_.getType() == EntityType.GLOW_ITEM_FRAME;
p_364469_.mapId = null;
if (!itemstack.isEmpty()) {
MapId mapid = p_369136_.getFramedMapId(itemstack);
if (mapid != null) {
MapItemSavedData mapitemsaveddata = p_369136_.level().getMapData(mapid);
if (mapitemsaveddata != null) {
this.mapRenderer.extractRenderState(mapid, mapitemsaveddata, p_364469_.mapRenderState);
p_364469_.mapId = mapid;
}
}
}
}
}