/**
* Copyright (c) Lambda Innovation, 2013-2016
* This file is part of the AcademyCraft mod.
* https://github.com/LambdaInnovation/AcademyCraft
* Licensed under GPLv3, see project root for more information.
*/
package cn.academy.core.client;
import cn.academy.core.Resources;
import cn.lambdalib.annoreg.core.Registrant;
import cn.lambdalib.util.client.HudUtils;
import cn.lambdalib.util.client.RenderUtils;
import cn.lambdalib.util.generic.MathUtils;
import cn.lambdalib.util.helper.Color;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
/**
* Some drawing utils.
* @author WeAthFolD
*/
@Registrant
@SideOnly(Side.CLIENT)
public class ACRenderingHelper {
public static ResourceLocation
GLOW_L = glowtex("left"),
GLOW_R = glowtex("right"),
GLOW_U = glowtex("up"),
GLOW_D = glowtex("down"),
GLOW_RU = glowtex("ru"),
GLOW_RD = glowtex("rd"),
GLOW_LU = glowtex("lu"),
GLOW_LD = glowtex("ld");
public static void drawGlow(double x, double y, double width, double height, double size, Color glowColor) {
glowColor.bind();
final double s = size;
GL11.glDisable(GL11.GL_ALPHA_TEST);
Tessellator t = Tessellator.instance;
gdraw(GLOW_L, x - s, y, s, height);
gdraw(GLOW_R, x + width, y, s, height);
gdraw(GLOW_U, x, y - s, width, s);
gdraw(GLOW_D, x, y + height, width, s);
gdraw(GLOW_RU, x + width, y - s, s, s);
gdraw(GLOW_RD, x + width, y + height, s, s);
gdraw(GLOW_LU, x - s, y - s, s, s);
gdraw(GLOW_LD, x - s, y + height, s, s);
}
public static boolean isThePlayer(EntityPlayer p) {
return p.equals(Minecraft.getMinecraft().thePlayer);
}
public static double getHeightFix(EntityPlayer p) {
return isThePlayer(p) ? 0.0 : 1.6;
}
/**
* Draws a circular progress bar at (0, 0) with radius 1
*/
public static void drawCircularProgbar(ResourceLocation texture, double progress) {
progress *= 360;
if(progress > 360)
progress %= 360;
Tessellator t = Tessellator.instance;
GL11.glPushMatrix();
RenderUtils.loadTexture(texture);
for(int i = 0; i < 4; ++i) {
double angle = Math.min(90, progress - 90 * i);
if(angle <= 0)
break;
double u1, v1;
t.startDrawing(GL11.GL_TRIANGLES);
if(angle <= 45) {
u1 = Math.tan(MathUtils.toRadians(angle));
v1 = 0;
} else {
u1 = 1;
v1 = 0;
double x = Math.tan(MathUtils.toRadians(90 - angle));
t.addVertexWithUV(1, -1, 0, 1, 0);
t.addVertexWithUV(0, 0, 0, 0, 1);
t.addVertexWithUV(1, -x, 0, 1, 1 - x);
}
t.addVertexWithUV(0, -1, 0, 0, 0);
t.addVertexWithUV(0, 0, 0, 0, 1);
t.addVertexWithUV(u1, -1 -v1, 0, u1, v1);
t.draw();
GL11.glRotated(90, 0, 0, 1);
}
GL11.glPopMatrix();
GL11.glEnable(GL11.GL_TEXTURE_2D);
}
public static void lineSegmentGlow(double x0, double y0, double x1, double y1, float width) {
RenderUtils.loadTexture(Resources.TEX_GLOW_LINE);
dirQuad(x0, y0, x1, y1, width);
}
public static void lineSegment(double x0, double y0, double x1, double y1, float width) {
boolean pre = GL11.glIsEnabled(GL11.GL_TEXTURE_2D);
GL11.glDisable(GL11.GL_TEXTURE_2D);
dirQuad(x0, y0, x1, y1, width);
if(pre) GL11.glEnable(GL11.GL_TEXTURE_2D);
}
private static void dirQuad(double x0, double y0, double x1, double y1, float width) {
float hw = width / 2;
Tessellator t = Tessellator.instance;
double dy = y1 - y0, dx = x1 - x0, len = Math.sqrt(dy * dy + dx * dx);
double theta = MathUtils.toDegrees(Math.atan2(dy, dx));
GL11.glPushMatrix();
GL11.glTranslated(x0, y0, 0);
GL11.glRotated(theta, 0, 0, 1);
t.startDrawingQuads();
t.addVertexWithUV(0, -hw, 0, 0, 0);
t.addVertexWithUV(0, hw, 0, 0, 1);
t.addVertexWithUV(len, hw, 0, 1, 1);
t.addVertexWithUV(len, -hw, 0, 1, 0);
t.draw();
GL11.glPopMatrix();
}
private static void gdraw(ResourceLocation tex, double x, double y, double width, double height) {
RenderUtils.loadTexture(tex);
HudUtils.rect(x, y, width, height);
}
private static ResourceLocation glowtex(String path) {
return Resources.getTexture("guis/glow_" + path);
}
}