package joshie.harvest.core.helpers; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderItem; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntityItemStackRenderer; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.util.ReportedException; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nullable; import static joshie.harvest.core.lib.HFModInfo.MODID; @SideOnly(Side.CLIENT) public class StackRenderHelper { public static final TextureManager textureManager = MCClientHelper.getMinecraft().getTextureManager(); private static final ResourceLocation RES_ITEM_GLINT = new ResourceLocation(MODID, "textures/gui/shadow.png"); public static boolean renderShadow; @SideOnly(Side.CLIENT) public static void drawStack(ItemStack stack, int left, int top, float size) { GlStateManager.disableAlpha(); GlStateManager.pushMatrix(); GlStateManager.scale(size, size, size); GlStateManager.disableLighting(); GlStateManager.color(1.0F, 1.0F, 1.0F); //Forge: Reset color in case Items change it. GlStateManager.enableBlend(); //Forge: Make sure blend is enabled else tabs show a white border. GlStateManager.enableLighting(); GlStateManager.enableRescaleNormal(); net.minecraft.client.renderer.RenderHelper.enableGUIStandardItemLighting(); Minecraft mc = MCClientHelper.getMinecraft(); mc.getRenderItem().renderItemAndEffectIntoGUI(stack, (int) (left / size), (int) (top / size)); String display = stack.stackSize > 1 ? stack.stackSize + "" : ""; mc.getRenderItem().renderItemOverlayIntoGUI(mc.fontRendererObj, stack, (int) (left / size), (int) (top / size), display); net.minecraft.client.renderer.RenderHelper.disableStandardItemLighting(); GlStateManager.disableLighting(); GlStateManager.popMatrix(); GlStateManager.enableAlpha(); } @SideOnly(Side.CLIENT) public static void drawGreyStack(ItemStack stack, int left, int top, float size) { GlStateManager.disableAlpha(); GlStateManager.pushMatrix(); GlStateManager.scale(size, size, size); GlStateManager.disableLighting(); GlStateManager.color(1.0F, 1.0F, 1.0F); //Forge: Reset color in case Items change it. GlStateManager.enableBlend(); //Forge: Make sure blend is enabled else tabs show a white border. GlStateManager.enableLighting(); GlStateManager.enableRescaleNormal(); net.minecraft.client.renderer.RenderHelper.enableGUIStandardItemLighting(); Minecraft mc = MCClientHelper.getMinecraft(); renderItemAndEffectIntoGUI(mc.getRenderItem(), MCClientHelper.getPlayer(), stack, (int) (left / size), (int) (top / size)); String display = stack.stackSize > 1 ? stack.stackSize + "" : ""; mc.getRenderItem().renderItemOverlayIntoGUI(mc.fontRendererObj, stack, (int) (left / size), (int) (top / size), display); net.minecraft.client.renderer.RenderHelper.disableStandardItemLighting(); GlStateManager.disableLighting(); GlStateManager.popMatrix(); GlStateManager.enableAlpha(); } @SideOnly(Side.CLIENT) private static void renderItemAndEffectIntoGUI(RenderItem render, @Nullable EntityLivingBase p_184391_1_, final ItemStack p_184391_2_, int p_184391_3_, int p_184391_4_) { if (p_184391_2_ != null && p_184391_2_.getItem() != null) { render.zLevel += 50.0F; try { renderItemModelIntoGUI(render, p_184391_2_, p_184391_3_, p_184391_4_, render.getItemModelWithOverrides(p_184391_2_, null, p_184391_1_)); } catch (Throwable throwable) { CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Rendering item"); CrashReportCategory crashreportcategory = crashreport.makeCategory("Item being rendered"); crashreportcategory.setDetail("Item Type", () -> String.valueOf(p_184391_2_.getItem())); crashreportcategory.setDetail("Item Aux", () -> String.valueOf(p_184391_2_.getMetadata())); crashreportcategory.setDetail("Item NBT", () -> String.valueOf(p_184391_2_.getTagCompound())); crashreportcategory.setDetail("Item Foil", () -> String.valueOf(p_184391_2_.hasEffect())); throw new ReportedException(crashreport); } render.zLevel -= 50.0F; } } @SideOnly(Side.CLIENT) private static void renderItemModelIntoGUI(RenderItem render, ItemStack stack, int x, int y, IBakedModel bakedmodel) { GlStateManager.pushMatrix(); textureManager.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); textureManager.getTexture(TextureMap.LOCATION_BLOCKS_TEXTURE).setBlurMipmap(false, false); GlStateManager.enableRescaleNormal(); GlStateManager.enableAlpha(); GlStateManager.alphaFunc(516, 0.1F); GlStateManager.enableBlend(); GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); render.setupGuiTransform(x, y, bakedmodel.isGui3d()); bakedmodel = net.minecraftforge.client.ForgeHooksClient.handleCameraTransforms(bakedmodel, ItemCameraTransforms.TransformType.GUI, false); renderItem(render, stack, bakedmodel); GlStateManager.disableAlpha(); GlStateManager.disableRescaleNormal(); GlStateManager.disableLighting(); GlStateManager.popMatrix(); textureManager.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); textureManager.getTexture(TextureMap.LOCATION_BLOCKS_TEXTURE).restoreLastBlurMipmap(); } @SideOnly(Side.CLIENT) private static void renderItem(RenderItem render, ItemStack stack, IBakedModel model) { if (stack != null) { GlStateManager.pushMatrix(); GlStateManager.translate(-0.5F, -0.5F, -0.5F); if (model.isBuiltInRenderer()) { GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); GlStateManager.enableRescaleNormal(); renderShadow = true; TileEntityItemStackRenderer.instance.renderByItem(stack); renderShadow = false; } else { render.renderModel(model, -1, stack); renderEffect(render, model); } GlStateManager.popMatrix(); } } @SideOnly(Side.CLIENT) private static void renderEffect(RenderItem render, IBakedModel model) { GlStateManager.depthMask(false); GlStateManager.depthFunc(514); GlStateManager.disableLighting(); textureManager.bindTexture(RES_ITEM_GLINT); GlStateManager.matrixMode(5890); GlStateManager.pushMatrix(); render.renderModel(model, 0xFFFFFFFF); GlStateManager.popMatrix(); GlStateManager.pushMatrix(); render.renderModel(model, 0xFFFFFFFF); GlStateManager.popMatrix(); GlStateManager.matrixMode(5888); GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); GlStateManager.enableLighting(); GlStateManager.depthFunc(515); GlStateManager.depthMask(true); } }