/**
* Copyright (c) Lambda Innovation, 2013-2015
* 本作品版权由Lambda Innovation所有。
* http://www.li-dev.cn/
*
* This project is open-source, and it is distributed under
* the terms of GNU General Public License. You can modify
* and distribute freely as long as you follow the license.
* 本项目是一个开源项目,且遵循GNU通用公共授权协议。
* 在遵照该协议的情况下,您可以自由传播和修改。
* http://www.gnu.org/licenses/gpl.html
*/
package cn.liutils.util.client;
import java.util.Iterator;
import java.util.List;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.Tessellator;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
/**
* @author WeAthFolD
*
*/
public class HudUtils {
public static double zLevel = 0;
static double stack = Double.NEGATIVE_INFINITY;
public static void pushZLevel() {
if(stack != Double.NEGATIVE_INFINITY)
throw new RuntimeException("Stack overflow");
stack = zLevel;
}
public static void popZLevel() {
if(stack == Double.NEGATIVE_INFINITY)
throw new RuntimeException("Stack underflow");
zLevel = stack;
stack = Double.NEGATIVE_INFINITY;
}
public static void rect(double width, double height) {
rect(0, 0, width, height);
}
public static void rect(double x, double y, double width, double height) {
rawRect(x, y, 0, 0, width, height, 1, 1);
}
public static void rect(double x, double y, double u, double v, double width, double height) {
rect(x, y, u, v, width, height, width, height);
}
public static void rect(double x, double y, double u, double v, double width, double height, double texWidth, double texHeight) {
int twidth = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH),
theight = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
double f = 1.0 / twidth, f1 = 1.0 / theight;
Tessellator t = Tessellator.instance;
t.startDrawingQuads();
t.addVertexWithUV(x + 0, y + height, zLevel, (u + 0) * f, (v + texHeight) * f1);
t.addVertexWithUV(x + width, y + height, zLevel, (u + texWidth) * f, (v + texHeight) * f1);
t.addVertexWithUV(x + width, y + 0, zLevel, (u + texWidth) * f, (v + 0) * f1);
t.addVertexWithUV(x + 0, y + 0, zLevel, (u + 0) * f, (v + 0) * f1);
t.draw();
}
public static void rawRect(double x, double y, double u, double v, double width, double height, double texWidth, double texHeight) {
Tessellator t = Tessellator.instance;
t.startDrawingQuads();
t.addVertexWithUV(x + 0, y + height, zLevel, (u + 0), (v + texHeight));
t.addVertexWithUV(x + width, y + height, zLevel, (u + texWidth), (v + texHeight));
t.addVertexWithUV(x + width, y + 0, zLevel, (u + texWidth), (v + 0));
t.addVertexWithUV(x + 0, y + 0, zLevel, (u + 0), (v + 0));
t.draw();
}
public static void colorRect(double x, double y, double width, double height) {
GL11.glDisable(GL11.GL_TEXTURE_2D);
Tessellator t = Tessellator.instance;
t.startDrawingQuads();
t.addVertex(x + 0, y + height, zLevel);
t.addVertex(x + width, y + height, zLevel);
t.addVertex(x + width, y + 0, zLevel);
t.addVertex(x + 0, y + 0, zLevel);
t.draw();
GL11.glEnable(GL11.GL_TEXTURE_2D);
}
public static void drawRectOutline(double x, double y, double w, double h, float lineWidth) {
GL11.glLineWidth(lineWidth);
Tessellator t = Tessellator.instance;
GL11.glDisable(GL11.GL_TEXTURE_2D);
t.startDrawing(GL11.GL_LINE_LOOP);
double lw = lineWidth * 0.2;
x -= lw;
y -= lw;
w += 2 * lw;
h += 2 * lw;
t.addVertex(x, y, zLevel);
t.addVertex(x, y + h, zLevel);
t.addVertex(x + w, y + h, zLevel);
t.addVertex(x + w, y, zLevel);
t.draw();
GL11.glEnable(GL11.GL_TEXTURE_2D);
}
public static void drawHoveringText(List par1List, int x, int y, FontRenderer font, int width, int height) {
if (!par1List.isEmpty()) {
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
RenderHelper.disableStandardItemLighting();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_DEPTH_TEST);
int k = 0;
float zLevel = -90.0F;
Iterator iterator = par1List.iterator();
while (iterator.hasNext()) {
String s = (String)iterator.next();
int l = font.getStringWidth(s);
if (l > k) {
k = l;
}
}
int i1 = x + 12;
int j1 = y - 12;
int k1 = 8;
if (par1List.size() > 1) {
k1 += 2 + (par1List.size() - 1) * 10;
}
if (i1 + k > width) {
i1 -= 28 + k;
}
if (j1 + k1 + 6 > height) {
j1 = height - k1 - 6;
}
zLevel = 300.0F;
int l1 = -267386864;
drawGradientRect(i1 - 3, j1 - 4, i1 + k + 3, j1 - 3, l1, l1);
drawGradientRect(i1 - 3, j1 + k1 + 3, i1 + k + 3, j1 + k1 + 4, l1, l1);
drawGradientRect(i1 - 3, j1 - 3, i1 + k + 3, j1 + k1 + 3, l1, l1);
drawGradientRect(i1 - 4, j1 - 3, i1 - 3, j1 + k1 + 3, l1, l1);
drawGradientRect(i1 + k + 3, j1 - 3, i1 + k + 4, j1 + k1 + 3, l1, l1);
int i2 = 1347420415;
int j2 = (i2 & 16711422) >> 1 | i2 & -16777216;
drawGradientRect(i1 - 3, j1 - 3 + 1, i1 - 3 + 1, j1 + k1 + 3 - 1, i2, j2);
drawGradientRect(i1 + k + 2, j1 - 3 + 1, i1 + k + 3, j1 + k1 + 3 - 1, i2, j2);
drawGradientRect(i1 - 3, j1 - 3, i1 + k + 3, j1 - 3 + 1, i2, i2);
drawGradientRect(i1 - 3, j1 + k1 + 2, i1 + k + 3, j1 + k1 + 3, j2, j2);
for (int k2 = 0; k2 < par1List.size(); ++k2) {
String s1 = (String)par1List.get(k2);
font.drawStringWithShadow(s1, i1, j1, -1);
if (k2 == 0) {
j1 += 2;
}
j1 += 10;
}
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_DEPTH_TEST);
RenderHelper.enableStandardItemLighting();
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
}
}
public static void drawGradientRect(int x0, int y0, int x1, int y1, int color1, int color2) {
float f = (color1 >> 24 & 255) / 255.0F;
float f1 = (color1 >> 16 & 255) / 255.0F;
float f2 = (color1 >> 8 & 255) / 255.0F;
float f3 = (color1 & 255) / 255.0F;
float f4 = (color2 >> 24 & 255) / 255.0F;
float f5 = (color2 >> 16 & 255) / 255.0F;
float f6 = (color2 >> 8 & 255) / 255.0F;
float f7 = (color2 & 255) / 255.0F;
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
GL11.glDisable(GL11.GL_ALPHA_TEST);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glShadeModel(GL11.GL_SMOOTH);
Tessellator t = Tessellator.instance;
t.startDrawingQuads();
t.setColorRGBA_F(f1, f2, f3, f);
t.addVertex(x1, y0, -90D);
t.addVertex(x0, y0, -90D);
t.setColorRGBA_F(f5, f6, f7, f4);
t.addVertex(x0, y1, -90D);
t.addVertex(x1, y1, -90D);
t.draw();
GL11.glShadeModel(GL11.GL_FLAT);
GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_ALPHA_TEST);
GL11.glEnable(GL11.GL_TEXTURE_2D);
}
}