package speiger.src.coreengine.rendering.gui.components; import java.util.List; import java.util.function.Supplier; import org.lwjgl.opengl.GL11; import speiger.src.coreengine.math.MathUtils; import speiger.src.coreengine.math.misc.ColorUtils; import speiger.src.coreengine.rendering.gui.GuiComponent; import speiger.src.coreengine.rendering.gui.renderer.buffer.RenderBuffer; import speiger.src.coreengine.rendering.tesselation.Tesselator; import speiger.src.coreengine.rendering.tesselation.VertexType; import speiger.src.coreengine.rendering.utils.GLUtils; public class PieComponent extends GuiComponent { public static final int FLAG_AUTO_UPDATE = 1 << 20; RenderBuffer buffer; Supplier> parts; int maxSteps; public PieComponent(int maxSteps, Supplier> parts) { super(0F, 0F, 0F, 0F); this.maxSteps = maxSteps; this.parts = parts; } public PieComponent(float x, float y, float width, float height, int maxSteps, Supplier> parts) { super(x, y, width, height); this.maxSteps = maxSteps; this.parts = parts; } @Override public void init() { addCloseListener(buffer = getRenderer().createBuffer()); } public final PieComponent setAutoUpdate(boolean value) { setFlag(FLAG_AUTO_UPDATE, value); return this; } public final boolean isAutoUpdating() { return isFlagSet(FLAG_AUTO_UPDATE); } public int getMaxSteps() { return maxSteps; } @Override protected boolean fixedUpdateSelf() { if(isAutoUpdating()) { createPie(); } return true; } @Override protected void repaint() { createPie(); } @Override protected boolean renderSelf(int mouseX, int mouseY, float particalTicks) { float centerX = getBox().getCenterX(); float centerY = getBox().getCenterY(); getRenderer().setBrightness(getActiveBrightness()).translate(centerX, centerY).flush(); GLUtils.DEBTH_TEST.push(true); getRenderer().drawBuffers(buffer, 0F, 0F).flush(); GLUtils.DEBTH_TEST.pop(); getRenderer().translate(-centerX, -centerY).setBrightness(1F); return true; } protected void createPie() { buffer.clear(); if(parts == null) { return; } float xSize = getBox().getWidth() / 2F; float ySize = getBox().getHeight() / 2F; float extra = getBox().getHeight() / 10F; float value = -3.17F; float spaceScale = 0.0495F * (127.0F / maxSteps); List indexes = parts.get(); int stepsDone = 0; Tesselator tes = buffer.start(GL11.GL_TRIANGLES, VertexType.UI); for(int j = indexes.size()-1;j>=0;j--) { IPieIndex pieIndex = indexes.get(j); int steps = j == 0 ? maxSteps - stepsDone : pieIndex.getSteps(); int color = pieIndex.getColor(); int darker = ColorUtils.darker(color); tes.offset(0F, 0F, 0.01F); for(int i = 0;i