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 { 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 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"; } }