package mekanism.client.gui.element; import java.util.ArrayList; import java.util.List; import mekanism.client.gui.IGuiWrapper; import mekanism.client.render.MekanismRenderer; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiGraph extends GuiElement { public int xPosition; public int yPosition; public int xSize; public int ySize; public int currentScale = 10; public boolean fixedScale = false; public List<Integer> graphData = new ArrayList<Integer>(); public GraphDataHandler dataHandler; public GuiGraph(IGuiWrapper gui, ResourceLocation def, int x, int y, int sizeX, int sizeY, GraphDataHandler handler) { super(MekanismUtils.getResource(ResourceType.GUI_ELEMENT, "GuiGraph.png"), gui, def); xPosition = x; yPosition = y; xSize = sizeX; ySize = sizeY; dataHandler = handler; } public void enableFixedScale(int scale) { fixedScale = true; currentScale = scale; } public void addData(int data) { if(graphData.size() == xSize) { graphData.remove(0); } graphData.add(data); if(!fixedScale) { for(int i : graphData) { if(i > currentScale) { currentScale = i; } } } } @Override public Rectangle4i getBounds(int guiWidth, int guiHeight) { return new Rectangle4i(guiWidth + xPosition, guiHeight + yPosition, xSize, ySize); } @Override public void renderBackground(int xAxis, int yAxis, int guiWidth, int guiHeight) { mc.renderEngine.bindTexture(RESOURCE); drawBlack(guiWidth, guiHeight); drawGraph(guiWidth, guiHeight); mc.renderEngine.bindTexture(defaultLocation); } @Override public void renderForeground(int xAxis, int yAxis) { if(xAxis >= xPosition && xAxis <= xPosition+xSize && yAxis >= yPosition && yAxis <= yPosition+ySize) { int height = ySize-(yAxis-yPosition); int scaled = (int)(((double)height/(double)ySize)*currentScale); displayTooltip(dataHandler.getDataDisplay(scaled), xAxis, yAxis); } } @Override public void preMouseClicked(int xAxis, int yAxis, int button) {} @Override public void mouseClicked(int xAxis, int yAxis, int button) {} public void drawBlack(int guiWidth, int guiHeight) { int xDisplays = xSize/10 + (xSize%10 > 0 ? 1 : 0); int yDisplays = ySize/10 + (ySize%10 > 0 ? 1 : 0); for(int yIter = 0; yIter < yDisplays; yIter++) { for(int xIter = 0; xIter < xDisplays; xIter++) { int width = (xSize%10 > 0 && xIter == xDisplays-1 ? xSize%10 : 10); int height = (ySize%10 > 0 && yIter == yDisplays-1 ? ySize%10 : 10); guiObj.drawTexturedRect(guiWidth + xPosition + (xIter*10), guiHeight + yPosition + (yIter*10), 0, 0, width, height); } } } public void drawGraph(int guiWidth, int guiHeight) { for(int i = 0; i < graphData.size(); i++) { int data = Math.min(currentScale, graphData.get(i)); int relativeHeight = (int)(((double)data/(double)currentScale)*ySize); guiObj.drawTexturedRect(guiWidth + xPosition + i, guiHeight + yPosition + (ySize-relativeHeight), 10, 0, 1, 1); int displays = (relativeHeight-1)/10 + ((relativeHeight-1)%10 > 0 ? 1 : 0); for(int iter = 0; iter < displays; iter++) { MekanismRenderer.blendOn(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.2F + (0.8F*((float)i/(float)graphData.size()))); int height = ((relativeHeight-1)%10 > 0 && iter == displays-1 ? (relativeHeight-1)%10 : 10); guiObj.drawTexturedRect(guiWidth + xPosition + i, guiHeight + yPosition + (ySize-(iter*10)) - 10 + (10-height), 11, 0, 1, height); MekanismRenderer.blendOff(); } } } public static interface GraphDataHandler { public String getDataDisplay(int data); } }