package rosegoldaddons.utils; import net.minecraft.client.Minecraft; import net.minecraft.client.model.ModelBase; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.shader.Framebuffer; import net.minecraft.entity.EntityLivingBase; import org.lwjgl.opengl.EXTFramebufferObject; import org.lwjgl.opengl.EXTPackedDepthStencil; import rosegoldaddons.events.RenderLivingEntityEvent; import java.awt.*; import static org.lwjgl.opengl.GL11.*; public class OutlineUtils { public static void outlineESP(EntityLivingBase entity, float p_77036_2_, float p_77036_3_, float p_77036_4_, float p_77036_5_, float p_77036_6_, float scaleFactor, ModelBase modelBase, Color color) { Minecraft mc = Minecraft.getMinecraft(); boolean fancyGraphics = mc.gameSettings.fancyGraphics; float gamma = mc.gameSettings.gammaSetting; mc.gameSettings.fancyGraphics = false; mc.gameSettings.gammaSetting = 100000F; GlStateManager.resetColor(); setColor(color); renderOne(2); modelBase.render(entity, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, scaleFactor); setColor(color); renderTwo(); modelBase.render(entity, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, scaleFactor); setColor(color); renderThree(); modelBase.render(entity, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, scaleFactor); setColor(color); renderFour(color); modelBase.render(entity, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, scaleFactor); setColor(color); renderFive(); setColor(Color.WHITE); mc.gameSettings.fancyGraphics = fancyGraphics; mc.gameSettings.gammaSetting = gamma; } public static void outlineESP(RenderLivingEntityEvent event, Color color) { Minecraft mc = Minecraft.getMinecraft(); boolean fancyGraphics = mc.gameSettings.fancyGraphics; float gamma = mc.gameSettings.gammaSetting; mc.gameSettings.fancyGraphics = false; mc.gameSettings.gammaSetting = 100000F; GlStateManager.resetColor(); setColor(color); renderOne(2); event.modelBase.render(event.entity, event.p_77036_2_, event.p_77036_3_, event.p_77036_4_, event.p_77036_5_, event.p_77036_6_, event.scaleFactor); setColor(color); renderTwo(); event.modelBase.render(event.entity, event.p_77036_2_, event.p_77036_3_, event.p_77036_4_, event.p_77036_5_, event.p_77036_6_, event.scaleFactor); setColor(color); renderThree(); event.modelBase.render(event.entity, event.p_77036_2_, event.p_77036_3_, event.p_77036_4_, event.p_77036_5_, event.p_77036_6_, event.scaleFactor); setColor(color); renderFour(color); event.modelBase.render(event.entity, event.p_77036_2_, event.p_77036_3_, event.p_77036_4_, event.p_77036_5_, event.p_77036_6_, event.scaleFactor); setColor(color); renderFive(); setColor(Color.WHITE); mc.gameSettings.fancyGraphics = fancyGraphics; mc.gameSettings.gammaSetting = gamma; } public static void renderOne(final float lineWidth) { checkSetupFBO(); glPushAttrib(GL_ALL_ATTRIB_BITS); glDisable(GL_ALPHA_TEST); glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glLineWidth(lineWidth); glEnable(GL_LINE_SMOOTH); glEnable(GL_STENCIL_TEST); glClear(GL_STENCIL_BUFFER_BIT); glClearStencil(0xF); glStencilFunc(GL_NEVER, 1, 0xF); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } public static void renderTwo() { glStencilFunc(GL_NEVER, 0, 0xF); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } public static void renderThree() { glStencilFunc(GL_EQUAL, 1, 0xF); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } public static void renderFour(final Color color) { setColor(color); glDepthMask(false); glDisable(GL_DEPTH_TEST); glEnable(GL_POLYGON_OFFSET_LINE); glPolygonOffset(1.0F, -2000000F); OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240.0F, 240.0F); } public static void renderFive() { glPolygonOffset(1.0F, 2000000F); glDisable(GL_POLYGON_OFFSET_LINE); glEnable(GL_DEPTH_TEST); glDepthMask(true); glDisable(GL_STENCIL_TEST); glDisable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE); glEnable(GL_BLEND); glEnable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); glEnable(GL_ALPHA_TEST); glPopAttrib(); } public static void setColor(final Color color) { glColor4d(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, color.getAlpha() / 255F); } public static void checkSetupFBO() { final Framebuffer fbo = Minecraft.getMinecraft().getFramebuffer(); if (fbo != null) { if (fbo.depthBuffer > -1) { setupFBO(fbo); fbo.depthBuffer = -1; } } } private static void setupFBO(final Framebuffer fbo) { EXTFramebufferObject.glDeleteRenderbuffersEXT(fbo.depthBuffer); final int stencil_depth_buffer_ID = EXTFramebufferObject.glGenRenderbuffersEXT(); EXTFramebufferObject.glBindRenderbufferEXT(EXTFramebufferObject.GL_RENDERBUFFER_EXT, stencil_depth_buffer_ID); EXTFramebufferObject.glRenderbufferStorageEXT(EXTFramebufferObject.GL_RENDERBUFFER_EXT, EXTPackedDepthStencil.GL_DEPTH_STENCIL_EXT, Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight); EXTFramebufferObject.glFramebufferRenderbufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, EXTFramebufferObject.GL_STENCIL_ATTACHMENT_EXT, EXTFramebufferObject.GL_RENDERBUFFER_EXT, stencil_depth_buffer_ID); EXTFramebufferObject.glFramebufferRenderbufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, EXTFramebufferObject.GL_DEPTH_ATTACHMENT_EXT, EXTFramebufferObject.GL_RENDERBUFFER_EXT, stencil_depth_buffer_ID); } }