diff options
author | RoseGoldIsntGay <yoavkau@gmail.com> | 2021-11-07 18:34:22 +0200 |
---|---|---|
committer | RoseGoldIsntGay <yoavkau@gmail.com> | 2021-11-07 18:34:22 +0200 |
commit | 6f69d1e1aff688bf2f5ca34754640eed5102b045 (patch) | |
tree | e931c56ad48dedb4cec6ffceb78ef0b320c1c192 /src/main/java/rosegoldaddons/utils/RenderUtils.java | |
download | RGA-6f69d1e1aff688bf2f5ca34754640eed5102b045.tar.gz RGA-6f69d1e1aff688bf2f5ca34754640eed5102b045.tar.bz2 RGA-6f69d1e1aff688bf2f5ca34754640eed5102b045.zip |
committed
or something
Diffstat (limited to 'src/main/java/rosegoldaddons/utils/RenderUtils.java')
-rw-r--r-- | src/main/java/rosegoldaddons/utils/RenderUtils.java | 682 |
1 files changed, 682 insertions, 0 deletions
diff --git a/src/main/java/rosegoldaddons/utils/RenderUtils.java b/src/main/java/rosegoldaddons/utils/RenderUtils.java new file mode 100644 index 0000000..5d3e2f2 --- /dev/null +++ b/src/main/java/rosegoldaddons/utils/RenderUtils.java @@ -0,0 +1,682 @@ +package rosegoldaddons.utils; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.BlockPos; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL14; + +import java.awt.*; +import java.util.HashMap; +import java.util.Map; + +import static java.lang.Math.*; +import static org.lwjgl.opengl.GL11.*; + +public class RenderUtils { + + private static final Map<Integer, Boolean> glCapMap = new HashMap<>(); + private static final int[] DISPLAY_LISTS_2D = new int[4]; + private static final Minecraft mc = Minecraft.getMinecraft(); + + static { + for (int i = 0; i < DISPLAY_LISTS_2D.length; i++) { + DISPLAY_LISTS_2D[i] = glGenLists(1); + } + + glNewList(DISPLAY_LISTS_2D[0], GL_COMPILE); + + quickDrawRect(-7F, 2F, -4F, 3F); + quickDrawRect(4F, 2F, 7F, 3F); + quickDrawRect(-7F, 0.5F, -6F, 3F); + quickDrawRect(6F, 0.5F, 7F, 3F); + + glEndList(); + + glNewList(DISPLAY_LISTS_2D[1], GL_COMPILE); + + quickDrawRect(-7F, 3F, -4F, 3.3F); + quickDrawRect(4F, 3F, 7F, 3.3F); + quickDrawRect(-7.3F, 0.5F, -7F, 3.3F); + quickDrawRect(7F, 0.5F, 7.3F, 3.3F); + + glEndList(); + + glNewList(DISPLAY_LISTS_2D[2], GL_COMPILE); + + quickDrawRect(4F, -20F, 7F, -19F); + quickDrawRect(-7F, -20F, -4F, -19F); + quickDrawRect(6F, -20F, 7F, -17.5F); + quickDrawRect(-7F, -20F, -6F, -17.5F); + + glEndList(); + + glNewList(DISPLAY_LISTS_2D[3], GL_COMPILE); + + quickDrawRect(7F, -20F, 7.3F, -17.5F); + quickDrawRect(-7.3F, -20F, -7F, -17.5F); + quickDrawRect(4F, -20.3F, 7.3F, -20F); + quickDrawRect(-7.3F, -20.3F, -4F, -20F); + + glEndList(); + } + + public static void drawBlockBox(final BlockPos blockPos, final Color color, final boolean outline, float partialTicks) { + final RenderManager renderManager = mc.getRenderManager(); + + final double x = blockPos.getX() - renderManager.viewerPosX; + final double y = blockPos.getY() - renderManager.viewerPosY; + final double z = blockPos.getZ() - renderManager.viewerPosZ; + + AxisAlignedBB axisAlignedBB = new AxisAlignedBB(x, y, z, x + 1.0, y + 1.0, z + 1.0); + final Block block = mc.theWorld.getBlockState(blockPos).getBlock(); + + if (block != null) { + final EntityPlayer player = mc.thePlayer; + + final double posX = player.lastTickPosX + (player.posX - player.lastTickPosX) * partialTicks; + final double posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks; + final double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; + + block.setBlockBoundsBasedOnState(mc.theWorld, blockPos); + + axisAlignedBB = block.getSelectedBoundingBox(mc.theWorld, blockPos) + .expand(0.0020000000949949026D, 0.0020000000949949026D, 0.0020000000949949026D) + .offset(-posX, -posY, -posZ); + } + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + enableGlCap(GL_BLEND); + disableGlCap(GL_TEXTURE_2D, GL_DEPTH_TEST); + glDepthMask(false); + + glColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha() != 255 ? color.getAlpha() : outline ? 26 : 35); + drawFilledBox(axisAlignedBB); + + if (outline) { + glLineWidth(1F); + enableGlCap(GL_LINE_SMOOTH); + glColor(color); + + drawSelectionBoundingBox(axisAlignedBB); + } + + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glDepthMask(true); + resetCaps(); + } + + public static void drawSelectionBoundingBox(AxisAlignedBB boundingBox) { + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + + worldrenderer.begin(GL_LINE_STRIP, DefaultVertexFormats.POSITION); + + // Lower Rectangle + worldrenderer.pos(boundingBox.minX, boundingBox.minY, boundingBox.minZ).endVertex(); + worldrenderer.pos(boundingBox.minX, boundingBox.minY, boundingBox.maxZ).endVertex(); + worldrenderer.pos(boundingBox.maxX, boundingBox.minY, boundingBox.maxZ).endVertex(); + worldrenderer.pos(boundingBox.maxX, boundingBox.minY, boundingBox.minZ).endVertex(); + worldrenderer.pos(boundingBox.minX, boundingBox.minY, boundingBox.minZ).endVertex(); + + // Upper Rectangle + worldrenderer.pos(boundingBox.minX, boundingBox.maxY, boundingBox.minZ).endVertex(); + worldrenderer.pos(boundingBox.minX, boundingBox.maxY, boundingBox.maxZ).endVertex(); + worldrenderer.pos(boundingBox.maxX, boundingBox.maxY, boundingBox.maxZ).endVertex(); + worldrenderer.pos(boundingBox.maxX, boundingBox.maxY, boundingBox.minZ).endVertex(); + worldrenderer.pos(boundingBox.minX, boundingBox.maxY, boundingBox.minZ).endVertex(); + + // Upper Rectangle + worldrenderer.pos(boundingBox.minX, boundingBox.maxY, boundingBox.maxZ).endVertex(); + worldrenderer.pos(boundingBox.minX, boundingBox.minY, boundingBox.maxZ).endVertex(); + + worldrenderer.pos(boundingBox.maxX, boundingBox.minY, boundingBox.maxZ).endVertex(); + worldrenderer.pos(boundingBox.maxX, boundingBox.maxY, boundingBox.maxZ).endVertex(); + + worldrenderer.pos(boundingBox.maxX, boundingBox.maxY, boundingBox.minZ).endVertex(); + worldrenderer.pos(boundingBox.maxX, boundingBox.minY, boundingBox.minZ).endVertex(); + + tessellator.draw(); + } + + public static void drawEntityBox(final Entity entity, final Color color, final boolean outline, float partialTicks) { + final RenderManager renderManager = mc.getRenderManager(); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + enableGlCap(GL_BLEND); + disableGlCap(GL_TEXTURE_2D, GL_DEPTH_TEST); + glDepthMask(false); + + final double x = entity.lastTickPosX + (entity.posX - entity.lastTickPosX) * partialTicks + - renderManager.viewerPosX; + final double y = entity.lastTickPosY + (entity.posY - entity.lastTickPosY) * partialTicks + - renderManager.viewerPosY; + final double z = entity.lastTickPosZ + (entity.posZ - entity.lastTickPosZ) * partialTicks + - renderManager.viewerPosZ; + + final AxisAlignedBB entityBox = entity.getEntityBoundingBox(); + final AxisAlignedBB axisAlignedBB = new AxisAlignedBB( + entityBox.minX - entity.posX + x - 0.05D, + entityBox.minY - entity.posY + y, + entityBox.minZ - entity.posZ + z - 0.05D, + entityBox.maxX - entity.posX + x + 0.05D, + entityBox.maxY - entity.posY + y + 0.15D, + entityBox.maxZ - entity.posZ + z + 0.05D + ); + + if (outline) { + glLineWidth(1F); + enableGlCap(GL_LINE_SMOOTH); + glColor(color.getRed(), color.getGreen(), color.getBlue(), 95); + drawSelectionBoundingBox(axisAlignedBB); + } + + glColor(color.getRed(), color.getGreen(), color.getBlue(), outline ? 26 : 35); + drawFilledBox(axisAlignedBB); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glDepthMask(true); + resetCaps(); + } + + public static void drawAxisAlignedBB(final AxisAlignedBB axisAlignedBB, final Color color) { + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glLineWidth(2F); + glDisable(GL_TEXTURE_2D); + glDisable(GL_DEPTH_TEST); + glDepthMask(false); + glColor(color); + drawFilledBox(axisAlignedBB); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_TEXTURE_2D); + glEnable(GL_DEPTH_TEST); + glDepthMask(true); + glDisable(GL_BLEND); + } + + public static void drawPlatform(final double y, final Color color, final double size) { + final RenderManager renderManager = mc.getRenderManager(); + final double renderY = y - renderManager.viewerPosY; + + drawAxisAlignedBB(new AxisAlignedBB(size, renderY + 0.02D, size, -size, renderY, -size), color); + } + + public static void drawPlatform(final Entity entity, final Color color, float partialTicks) { + final RenderManager renderManager = mc.getRenderManager(); + + final double x = entity.lastTickPosX + (entity.posX - entity.lastTickPosX) * partialTicks + - renderManager.viewerPosX; + final double y = entity.lastTickPosY + (entity.posY - entity.lastTickPosY) * partialTicks + - renderManager.viewerPosY; + final double z = entity.lastTickPosZ + (entity.posZ - entity.lastTickPosZ) * partialTicks + - renderManager.viewerPosZ; + + final AxisAlignedBB axisAlignedBB = entity.getEntityBoundingBox() + .offset(-entity.posX, -entity.posY, -entity.posZ) + .offset(x, y, z); + + drawAxisAlignedBB( + new AxisAlignedBB(axisAlignedBB.minX, axisAlignedBB.maxY + 0.2, axisAlignedBB.minZ, axisAlignedBB.maxX, axisAlignedBB.maxY + 0.26, axisAlignedBB.maxZ), + color + ); + } + + public static void drawFilledBox(final AxisAlignedBB axisAlignedBB) { + final Tessellator tessellator = Tessellator.getInstance(); + final WorldRenderer worldRenderer = tessellator.getWorldRenderer(); + + worldRenderer.begin(7, DefaultVertexFormats.POSITION); + + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + tessellator.draw(); + } + + public static void quickDrawRect(final float x, final float y, final float x2, final float y2) { + glBegin(GL_QUADS); + + glVertex2d(x2, y); + glVertex2d(x, y); + glVertex2d(x, y2); + glVertex2d(x2, y2); + + glEnd(); + } + + public static void drawRect(final float x, final float y, final float x2, final float y2, final int color) { + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_LINE_SMOOTH); + + glColor(color); + glBegin(GL_QUADS); + + glVertex2f(x2, y); + glVertex2f(x, y); + glVertex2f(x, y2); + glVertex2f(x2, y2); + glEnd(); + + glEnable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + glDisable(GL_LINE_SMOOTH); + } + + public static void drawRect(final int x, final int y, final int x2, final int y2, final int color) { + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_LINE_SMOOTH); + + glColor(color); + glBegin(GL_QUADS); + + glVertex2i(x2, y); + glVertex2i(x, y); + glVertex2i(x, y2); + glVertex2i(x2, y2); + glEnd(); + + glEnable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + glDisable(GL_LINE_SMOOTH); + } + + /** + * Like {@link #drawRect(float, float, float, float, int)}, but without setup + */ + public static void quickDrawRect(final float x, final float y, final float x2, final float y2, final int color) { + glColor(color); + glBegin(GL_QUADS); + + glVertex2d(x2, y); + glVertex2d(x, y); + glVertex2d(x, y2); + glVertex2d(x2, y2); + + glEnd(); + } + + public static void drawRect(final float x, final float y, final float x2, final float y2, final Color color) { + drawRect(x, y, x2, y2, color.getRGB()); + } + + public static void drawBorderedRect(final float x, final float y, final float x2, final float y2, final float width, + final int color1, final int color2) { + drawRect(x, y, x2, y2, color2); + drawBorder(x, y, x2, y2, width, color1); + } + + public static void drawBorder(float x, float y, float x2, float y2, float width, int color1) { + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_LINE_SMOOTH); + + glColor(color1); + glLineWidth(width); + + glBegin(GL_LINE_LOOP); + + glVertex2d(x2, y); + glVertex2d(x, y); + glVertex2d(x, y2); + glVertex2d(x2, y2); + + glEnd(); + + glEnable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + glDisable(GL_LINE_SMOOTH); + } + + public static void quickDrawBorderedRect(final float x, final float y, final float x2, final float y2, final float width, final int color1, final int color2) { + quickDrawRect(x, y, x2, y2, color2); + + glColor(color1); + glLineWidth(width); + + glBegin(GL_LINE_LOOP); + + glVertex2d(x2, y); + glVertex2d(x, y); + glVertex2d(x, y2); + glVertex2d(x2, y2); + + glEnd(); + } + + public static void drawLoadingCircle(float x, float y) { + for (int i = 0; i < 4; i++) { + int rot = (int) ((System.nanoTime() / 5000000 * i) % 360); + drawCircle(x, y, i * 10, rot - 180, rot); + } + } + + public static void drawCircle(float x, float y, float radius, int start, int end) { + GlStateManager.enableBlend(); + GlStateManager.disableTexture2D(); + GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO); + glColor(Color.WHITE); + + glEnable(GL_LINE_SMOOTH); + glLineWidth(2F); + glBegin(GL_LINE_STRIP); + for (float i = end; i >= start; i -= (360 / 90.0f)) { + glVertex2f((float) (x + (cos(i * PI / 180) * (radius * 1.001F))), (float) (y + (sin(i * PI / 180) * (radius * 1.001F)))); + } + glEnd(); + glDisable(GL_LINE_SMOOTH); + + GlStateManager.enableTexture2D(); + GlStateManager.disableBlend(); + } + + public static void drawFilledCircle(final int xx, final int yy, final float radius, final Color color) { + int sections = 50; + double dAngle = 2 * Math.PI / sections; + float x, y; + + glPushAttrib(GL_ENABLE_BIT); + + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_LINE_SMOOTH); + glBegin(GL_TRIANGLE_FAN); + + for (int i = 0; i < sections; i++) { + x = (float) (radius * Math.sin((i * dAngle))); + y = (float) (radius * Math.cos((i * dAngle))); + + glColor4f(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, color.getAlpha() / 255F); + glVertex2f(xx + x, yy + y); + } + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + glEnd(); + + glPopAttrib(); + } + + public static void drawImage(ResourceLocation image, int x, int y, int width, int height) { + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glDepthMask(false); + GL14.glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO); + glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + mc.getTextureManager().bindTexture(image); + drawModalRectWithCustomSizedTexture(x, y, 0, 0, width, height, width, height); + glDepthMask(true); + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + } + + /** + * Draws a textured rectangle at z = 0. Args: x, y, u, v, width, height, textureWidth, textureHeight + */ + public static void drawModalRectWithCustomSizedTexture(float x, float y, float u, float v, float width, float height, float textureWidth, float textureHeight) { + float f = 1.0F / textureWidth; + float f1 = 1.0F / textureHeight; + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + worldrenderer.begin(7, DefaultVertexFormats.POSITION); + worldrenderer.pos(x, y + height, 0.0D).tex(u * f, (v + height) * f1).endVertex(); + worldrenderer.pos(x + width, y + height, 0.0D).tex((u + width) * f, (v + height) * f1).endVertex(); + worldrenderer.pos(x + width, y, 0.0D).tex((u + width) * f, v * f1).endVertex(); + worldrenderer.pos(x, y, 0.0D).tex(u * f, v * f1).endVertex(); + tessellator.draw(); + } + + public static void glColor(final int red, final int green, final int blue, final int alpha) { + GL11.glColor4f(red / 255F, green / 255F, blue / 255F, alpha / 255F); + } + + public static void glColor(final Color color) { + glColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); + } + + private static void glColor(final int hex) { + glColor(hex >> 16 & 0xFF, hex >> 8 & 0xFF, hex & 0xFF, hex >> 24 & 0xFF); + } + + public static void draw2D(final EntityLivingBase entity, final double posX, final double posY, final double posZ, final int color, final int backgroundColor) { + GL11.glPushMatrix(); + GL11.glTranslated(posX, posY, posZ); + GL11.glRotated(-mc.getRenderManager().viewerPosY, 0F, 1F, 0F); + GL11.glScaled(-0.1D, -0.1D, 0.1D); + + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + GL11.glDepthMask(true); + + glColor(color); + + glCallList(DISPLAY_LISTS_2D[0]); + + glColor(backgroundColor); + + glCallList(DISPLAY_LISTS_2D[1]); + + GL11.glTranslated(0, 21 + -(entity.getEntityBoundingBox().maxY - entity.getEntityBoundingBox().minY) * 12, 0); + + glColor(color); + glCallList(DISPLAY_LISTS_2D[2]); + + glColor(backgroundColor); + glCallList(DISPLAY_LISTS_2D[3]); + + // Stop render + glEnable(GL_DEPTH_TEST); + glEnable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + + GL11.glPopMatrix(); + } + + public static void draw2D(final BlockPos blockPos, final int color, final int backgroundColor) { + final RenderManager renderManager = mc.getRenderManager(); + + final double posX = (blockPos.getX() + 0.5) - renderManager.viewerPosX; + final double posY = blockPos.getY() - renderManager.viewerPosY; + final double posZ = (blockPos.getZ() + 0.5) - renderManager.viewerPosZ; + + GL11.glPushMatrix(); + GL11.glTranslated(posX, posY, posZ); + GL11.glRotated(-mc.getRenderManager().playerViewY, 0F, 1F, 0F); + GL11.glScaled(-0.1D, -0.1D, 0.1D); + + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + GL11.glDepthMask(true); + + glColor(color); + + glCallList(DISPLAY_LISTS_2D[0]); + + glColor(backgroundColor); + + glCallList(DISPLAY_LISTS_2D[1]); + + GL11.glTranslated(0, 9, 0); + + glColor(color); + + glCallList(DISPLAY_LISTS_2D[2]); + + glColor(backgroundColor); + + glCallList(DISPLAY_LISTS_2D[3]); + + // Stop render + glEnable(GL_DEPTH_TEST); + glEnable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + + GL11.glPopMatrix(); + } + + public static void renderNameTag(final String string, final double x, final double y, final double z) { + final RenderManager renderManager = mc.getRenderManager(); + + glPushMatrix(); + glTranslated(x - renderManager.viewerPosX, y - renderManager.viewerPosY, z - renderManager.viewerPosZ); + glNormal3f(0F, 1F, 0F); + glRotatef(-mc.getRenderManager().playerViewY, 0F, 1F, 0F); + glRotatef(mc.getRenderManager().playerViewX, 1F, 0F, 0F); + glScalef(-0.05F, -0.05F, 0.05F); + setGlCap(GL_LIGHTING, false); + setGlCap(GL_DEPTH_TEST, false); + setGlCap(GL_BLEND, true); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + final int width = mc.fontRendererObj.getStringWidth(string) / 2; + + drawRect(-width - 1, -1, width + 1, mc.fontRendererObj.FONT_HEIGHT, Integer.MIN_VALUE); + mc.fontRendererObj.drawString(string, -width, 1.5F, Color.WHITE.getRGB(), true); + + resetCaps(); + glColor4f(1F, 1F, 1F, 1F); + glPopMatrix(); + } + + public static void drawLine(final double x, final double y, final double x1, final double y1, final float width) { + glDisable(GL_TEXTURE_2D); + glLineWidth(width); + glBegin(GL_LINES); + glVertex2d(x, y); + glVertex2d(x1, y1); + glEnd(); + glEnable(GL_TEXTURE_2D); + } + + public static void makeScissorBox(final float x, final float y, final float x2, final float y2) { + final ScaledResolution scaledResolution = new ScaledResolution(mc); + final int factor = scaledResolution.getScaleFactor(); + glScissor((int) (x * factor), (int) ((scaledResolution.getScaledHeight() - y2) * factor), (int) ((x2 - x) * factor), (int) ((y2 - y) * factor)); + } + + /** + * GL CAP MANAGER + * <p> + * TODO: Remove gl cap manager and replace by something better + */ + + public static void resetCaps() { + glCapMap.forEach(RenderUtils::setGlState); + } + + public static void enableGlCap(final int cap) { + setGlCap(cap, true); + } + + public static void enableGlCap(final int... caps) { + for (final int cap : caps) + setGlCap(cap, true); + } + + public static void disableGlCap(final int cap) { + setGlCap(cap, true); + } + + public static void disableGlCap(final int... caps) { + for (final int cap : caps) + setGlCap(cap, false); + } + + public static void setGlCap(final int cap, final boolean state) { + glCapMap.put(cap, glGetBoolean(cap)); + setGlState(cap, state); + } + + public static void setGlState(final int cap, final boolean state) { + if (state) + glEnable(cap); + else + glDisable(cap); + } + + public static void drawScaledCustomSizeModalRect(int x, int y, float u, float v, int uWidth, int vHeight, int width, int height, float tileWidth, float tileHeight) { + float f = 1.0F / tileWidth; + float f1 = 1.0F / tileHeight; + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + worldrenderer.begin(7, DefaultVertexFormats.POSITION); + worldrenderer.pos(x, y + height, 0.0D).tex(u * f, (v + (float) vHeight) * f1).endVertex(); + worldrenderer.pos(x + width, y + height, 0.0D).tex((u + (float) uWidth) * f, (v + (float) vHeight) * f1).endVertex(); + worldrenderer.pos(x + width, y, 0.0D).tex((u + (float) uWidth) * f, v * f1).endVertex(); + worldrenderer.pos(x, y, 0.0D).tex(u * f, v * f1).endVertex(); + tessellator.draw(); + } + +}
\ No newline at end of file |