package openmods.gui.component;
import java.awt.Color;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.Tessellator;
import openmods.api.IValueReceiver;
import openmods.gui.listener.IValueChangedListener;
import org.lwjgl.opengl.GL11;
public class GuiComponentColorPicker extends BaseComponent implements IValueReceiver<Integer> {
private int pointX = 0;
private int pointY = 0;
public int tone;
private IValueChangedListener<Integer> listener;
public GuiComponentColorPicker(int x, int y) {
super(x, y);
}
public int getColor() {
float h = pointX * 0.01f;
float b = 1.0f - (pointY * 0.02f);
float s = 1.0f - (tone / 255f);
return Color.HSBtoRGB(h, s, b) & 0xFFFFFF;
}
public void setFromColor(int col) {
float[] hsb = new float[3];
Color.RGBtoHSB((col & 0xFF0000) >> 16, (col & 0x00FF00) >> 8, col & 0x0000FF, hsb);
pointX = (int)(hsb[0] * 100);
pointY = (int)((1.0f - hsb[2]) * 50);
tone = (255 - (int)(hsb[1] * 255));
}
@Override
public int getWidth() {
return 100;
}
@Override
public int getHeight() {
return 70;
}
public int getColorsHeight() {
return getHeight() - 20;
}
@Override
public void mouseDown(int mouseX, int mouseY, int button) {
super.mouseDown(mouseX, mouseY, button);
if (mouseY > getColorsHeight()) { return; }
pointX = mouseX;
pointY = mouseY;
notifyListeners();
}
// Drag support
@Override
public void mouseDrag(int mouseX, int mouseY, int button, long time) {
super.mouseDrag(mouseX, mouseY, button, time);
if (mouseY > getColorsHeight()) { return; }
pointX = mouseX;
pointY = mouseY;
notifyListeners();
}
private void notifyListeners() {
if (listener != null) listener.valueChanged(getColor());
}
@Override
public void render(Minecraft minecraft, int offsetX, int offsetY, int mouseX, int mouseY) {
GL11.glColor4f(1, 1, 1, 1);
int renderX = offsetX + x;
int renderY = offsetY + y;
bindComponentsSheet();
drawTexturedModalRect(renderX, renderY, 156, 206, getWidth(), getColorsHeight());
drawRect(renderX, renderY, renderX + getWidth(), renderY + getColorsHeight(), (tone << 24) | 0xFFFFFF);
Tessellator tessellator = Tessellator.instance;
GL11.glEnable(GL11.GL_BLEND);
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glDisable(GL11.GL_ALPHA_TEST);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glShadeModel(GL11.GL_SMOOTH);
tessellator.startDrawingQuads();
tessellator.setColorRGBA_F(0, 0, 0, 1.0f);
tessellator.addVertex(renderX, (double)renderY + getColorsHeight(), 0.0D);
tessellator.addVertex((double)renderX + getWidth(), (double)renderY + getColorsHeight(), 0.0D);
tessellator.setColorRGBA_F(0, 0, 0, 0f);
tessellator.addVertex((double)renderX + getWidth(), renderY, 0.0D);
tessellator.addVertex(renderX, renderY, 0.0D);
tessellator.draw();
GL11.glShadeModel(GL11.GL_FLAT);
GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_ALPHA_TEST);
drawRect(renderX + pointX - 1,
renderY + pointY - 1,
renderX + pointX + 1,
renderY + pointY + 1, 0xCCCC0000);
}
@Override
public void renderOverlay(Minecraft minecraft, int offsetX, int offsetY, int mouseX, int mouseY) {}
@Override
public void setValue(Integer value) {
setFromColor(value);
}
public void setListener(IValueChangedListener<Integer> listener) {
this.listener = listener;
}
}