minecraft-src/net/minecraft/client/gui/render/pip/OversizedItemRenderer.java
2025-09-18 12:37:33 +00:00

86 lines
3.3 KiB
Java

package net.minecraft.client.gui.render.pip;
import com.mojang.blaze3d.platform.Lighting.Entry;
import com.mojang.blaze3d.vertex.PoseStack;
import java.util.Objects;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.navigation.ScreenRectangle;
import net.minecraft.client.gui.render.state.GuiItemRenderState;
import net.minecraft.client.gui.render.state.GuiRenderState;
import net.minecraft.client.gui.render.state.pip.OversizedItemRenderState;
import net.minecraft.client.renderer.MultiBufferSource.BufferSource;
import net.minecraft.client.renderer.item.TrackingItemStackRenderState;
import net.minecraft.client.renderer.texture.OverlayTexture;
import org.jetbrains.annotations.Nullable;
@Environment(EnvType.CLIENT)
public class OversizedItemRenderer extends PictureInPictureRenderer<OversizedItemRenderState> {
private boolean usedOnThisFrame;
@Nullable
private Object modelOnTextureIdentity;
public OversizedItemRenderer(BufferSource bufferSource) {
super(bufferSource);
}
public boolean usedOnThisFrame() {
return this.usedOnThisFrame;
}
public void resetUsedOnThisFrame() {
this.usedOnThisFrame = false;
}
public void invalidateTexture() {
this.modelOnTextureIdentity = null;
}
@Override
public Class<OversizedItemRenderState> getRenderStateClass() {
return OversizedItemRenderState.class;
}
protected void renderToTexture(OversizedItemRenderState oversizedItemRenderState, PoseStack poseStack) {
poseStack.scale(1.0F, -1.0F, -1.0F);
GuiItemRenderState guiItemRenderState = oversizedItemRenderState.guiItemRenderState();
ScreenRectangle screenRectangle = guiItemRenderState.oversizedItemBounds();
Objects.requireNonNull(screenRectangle);
float f = (screenRectangle.left() + screenRectangle.right()) / 2.0F;
float g = (screenRectangle.top() + screenRectangle.bottom()) / 2.0F;
float h = guiItemRenderState.x() + 8.0F;
float i = guiItemRenderState.y() + 8.0F;
poseStack.translate((h - f) / 16.0F, (g - i) / 16.0F, 0.0F);
TrackingItemStackRenderState trackingItemStackRenderState = guiItemRenderState.itemStackRenderState();
boolean bl = !trackingItemStackRenderState.usesBlockLight();
if (bl) {
Minecraft.getInstance().gameRenderer.getLighting().setupFor(Entry.ITEMS_FLAT);
} else {
Minecraft.getInstance().gameRenderer.getLighting().setupFor(Entry.ITEMS_3D);
}
trackingItemStackRenderState.render(poseStack, this.bufferSource, 15728880, OverlayTexture.NO_OVERLAY);
this.modelOnTextureIdentity = trackingItemStackRenderState.getModelIdentity();
}
public void blitTexture(OversizedItemRenderState oversizedItemRenderState, GuiRenderState guiRenderState) {
super.blitTexture(oversizedItemRenderState, guiRenderState);
this.usedOnThisFrame = true;
}
public boolean textureIsReadyToBlit(OversizedItemRenderState oversizedItemRenderState) {
TrackingItemStackRenderState trackingItemStackRenderState = oversizedItemRenderState.guiItemRenderState().itemStackRenderState();
return !trackingItemStackRenderState.isAnimated() && trackingItemStackRenderState.getModelIdentity().equals(this.modelOnTextureIdentity);
}
@Override
protected float getTranslateY(int height, int guiScale) {
return height / 2.0F;
}
@Override
protected String getTextureLabel() {
return "oversized_item";
}
}