From 5aea1281caa0d5c35b993dbce66bf58778d49df3 Mon Sep 17 00:00:00 2001 From: malte0811 Date: Sun, 20 Jan 2019 21:18:09 +0100 Subject: [PATCH] Add a RGB indicator component, see #71 ToDo: Recipe, Docs, Texture, localization including GUI --- .../controlpanel/PanelComponent.java | 1 + .../controlpanel/PropertyComponents.java | 1 + .../controlpanel/RGBIndicator.java | 248 ++++++++++++++++++ .../industrialwires/controlpanel/Variac.java | 8 +- .../items/ItemPanelComponent.java | 2 +- 5 files changed, 255 insertions(+), 5 deletions(-) create mode 100644 src/main/java/malte0811/industrialwires/controlpanel/RGBIndicator.java diff --git a/src/main/java/malte0811/industrialwires/controlpanel/PanelComponent.java b/src/main/java/malte0811/industrialwires/controlpanel/PanelComponent.java index 6f17210..afea1ca 100644 --- a/src/main/java/malte0811/industrialwires/controlpanel/PanelComponent.java +++ b/src/main/java/malte0811/industrialwires/controlpanel/PanelComponent.java @@ -66,6 +66,7 @@ public abstract class PanelComponent implements IOwner { baseCreaters.put("lock", Lock::new); baseCreaters.put("panel_meter", PanelMeter::new); baseCreaters.put(SevenSegDisplay.NAME, SevenSegDisplay::new); + baseCreaters.put("rgb_led", RGBIndicator::new); //Check that all components implement equals+hashCode if in a dev env boolean isDevEnv = "NBTTagCompound".equals(NBTTagCompound.class.getSimpleName()); if (isDevEnv) { diff --git a/src/main/java/malte0811/industrialwires/controlpanel/PropertyComponents.java b/src/main/java/malte0811/industrialwires/controlpanel/PropertyComponents.java index 7765e55..6836dd4 100644 --- a/src/main/java/malte0811/industrialwires/controlpanel/PropertyComponents.java +++ b/src/main/java/malte0811/industrialwires/controlpanel/PropertyComponents.java @@ -179,6 +179,7 @@ public class PropertyComponents implements IUnlistedProperty. + */ + +package malte0811.industrialwires.controlpanel; + +import malte0811.industrialwires.IndustrialWires; +import malte0811.industrialwires.client.RawQuad; +import malte0811.industrialwires.client.gui.GuiPanelCreator; +import malte0811.industrialwires.controlpanel.ControlPanelNetwork.RSChannel; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.util.vector.Vector3f; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static malte0811.industrialwires.util.NBTKeys.RS_CHANNEL; +import static malte0811.industrialwires.util.NBTKeys.RS_ID; + +public class RGBIndicator extends PanelComponent implements IConfigurableComponent { + @Nonnull + private RSChannel[] input = {RSChannel.DEFAULT_CHANNEL, RSChannel.DEFAULT_CHANNEL, RSChannel.DEFAULT_CHANNEL}; + private int rgbState; + + public RGBIndicator() { + super("rgb_led"); + } + + public RGBIndicator(@Nonnull RSChannel[] input) { + this(); + this.input = input; + } + + @Override + protected void writeCustomNBT(NBTTagCompound nbt, boolean toItem) { + NBTTagList channels = new NBTTagList(); + for (RSChannel c : input) { + NBTTagCompound ch = new NBTTagCompound(); + ch.setInteger(RS_ID, c.getController()); + ch.setByte(RS_CHANNEL, c.getColor()); + channels.appendTag(ch); + } + nbt.setTag("channels", channels); + if (!toItem) { + nbt.setInteger("rgb", rgbState); + } + } + + @Override + protected void readCustomNBT(NBTTagCompound nbt) { + NBTTagList channels = nbt.getTagList("channels", Constants.NBT.TAG_COMPOUND); + if (channels.tagCount() == 3) { + RSChannel[] in = new RSChannel[channels.tagCount()]; + for (int i = 0; i < in.length; i++) { + NBTTagCompound ch = channels.getCompoundTagAt(i); + int rsController = ch.getInteger(RS_ID); + byte rsColor = ch.getByte(RS_CHANNEL); + in[i] = new RSChannel(rsController, rsColor); + } + input = in; + } + rgbState = nbt.getInteger("rgb"); + } + + private static final float size = .0625F; + + @Override + @SideOnly(Side.CLIENT) + public List getQuads() { + float[] color = new float[4]; + color[3] = 1; + for (int i = 0; i < 3; i++) { + color[i] = ((rgbState >> (i * 8)) & 255) / 255F; + } + List ret = new ArrayList<>(1); + PanelUtils.addColoredQuad(ret, new Vector3f(), new Vector3f(0, 0, size), new Vector3f(size, 0, size), new Vector3f(size, 0, 0), EnumFacing.UP, color); + if (rgbState > 0) { + ret.get(ret.size() - 1).light = 0xff0ff; + } + return ret; + } + + @Nonnull + @Override + public PanelComponent copyOf() { + RGBIndicator ret = new RGBIndicator(Arrays.copyOf(input, input.length)); + ret.rgbState = rgbState; + ret.setX(x); + ret.setY(y); + ret.panelHeight = panelHeight; + return ret; + } + + @Nonnull + @Override + public AxisAlignedBB getBlockRelativeAABB() { + if (aabb == null) { + aabb = new AxisAlignedBB(x, 0, y, x + size, 0, y + size); + } + return aabb; + } + + @Override + public void interactWith(Vec3d hitRelative, EntityPlayerMP player) { + } + + @Override + public void update() { + + } + + + @Override + public void setNetwork(ControlPanelNetwork net) { + super.setNetwork(net); + for (int i = 0; i < input.length; i++) { + int finalI = i; + net.addListener(this, (state) -> { + byte currState = (byte) ((rgbState >> (8 * finalI + 4)) & 15); + if (state.getStrength() != currState) { + rgbState &= ~(255 << (8 * finalI)); + rgbState |= state.getStrength() << (8 * finalI + 4); + panel.markDirty(); + panel.triggerRenderUpdate(); + } + }, input[i]); + } + } + + @Override + public float getHeight() { + return 0; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + + RGBIndicator that = (RGBIndicator) o; + + return rgbState == that.rgbState; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + rgbState; + return result; + } + + @Override + @SideOnly(Side.CLIENT) + public void renderInGUI(GuiPanelCreator gui) { + renderInGUIDefault(gui, 0xffffff); + } + + @Override + public void applyConfigOption(ConfigType type, int id, NBTBase value) { + switch (type) { + case RS_CHANNEL: + input[id] = input[id].withColor(value); + break; + case INT: + input[id] = input[id].withController(value); + break; + } + } + + @Nullable + @Override + @SideOnly(Side.CLIENT) + public String fomatConfigName(ConfigType type, int id) { + switch (type) { + case FLOAT: + return I18n.format(IndustrialWires.MODID + ".desc." + (id == 0 ? "red" : (id == 1 ? "green" : "blue"))); + case RS_CHANNEL: + case INT: + default: + return null; + } + } + + @Nullable + @Override + @SideOnly(Side.CLIENT) + public String fomatConfigDescription(ConfigType type, int id) { + //TODO + switch (type) { + case FLOAT: + return null; + case RS_CHANNEL: + return I18n.format(IndustrialWires.MODID + ".desc.rschannel_info"); + case INT: + return I18n.format(IndustrialWires.MODID + ".desc.rsid_info"); + default: + return null; + } + } + + @Override + public RSColorConfig[] getRSChannelOptions() { + return new RSColorConfig[]{ + new RSColorConfig("channelR", 0, 10, input[0].getColor()), + new RSColorConfig("channelG", 50, 10, input[1].getColor()), + new RSColorConfig("channelB", 0, 70, input[2].getColor()) + }; + } + + @Override + public IntConfig[] getIntegerOptions() { + return new IntConfig[]{ + new IntConfig("rsIdR", 0, 0, input[0].getController(), 2, false), + new IntConfig("rsIdG", 50, 0, input[1].getController(), 2, false), + new IntConfig("rsIdB", 0, 60, input[2].getController(), 2, false) + }; + } + + @Override + public int getColor() { + return 0xffffff; + } +} \ No newline at end of file diff --git a/src/main/java/malte0811/industrialwires/controlpanel/Variac.java b/src/main/java/malte0811/industrialwires/controlpanel/Variac.java index 7a84c45..af7eaf4 100644 --- a/src/main/java/malte0811/industrialwires/controlpanel/Variac.java +++ b/src/main/java/malte0811/industrialwires/controlpanel/Variac.java @@ -193,13 +193,13 @@ public class Variac extends PanelComponent implements IConfigurableComponent { int bottom = (int) Math.floor(gui.getY0() + (aabb.maxZ - offset) * gui.panelSize); GlStateManager.pushMatrix(); - GlStateManager.translate((left + right) / 2, (top + bottom) / 2, 0); + GlStateManager.translate((left + right) / 2F, (top + bottom) / 2F, 0); GlStateManager.rotate(360 / 17F, 0, 0, 1); - GlStateManager.translate(-(left + right) / 2, -(top + bottom) / 2, 0); + GlStateManager.translate(-(left + right) / 2F, -(top + bottom) / 2F, 0); Gui.drawRect(left, top, right, bottom, 0xff333333); - GlStateManager.translate((left + right) / 2, (top + bottom) / 2, 0); + GlStateManager.translate((left + right) / 2F, (top + bottom) / 2F, 0); GlStateManager.rotate(45, 0, 0, 1); - GlStateManager.translate(-(left + right) / 2, -(top + bottom) / 2, 0); + GlStateManager.translate(-(left + right) / 2F, -(top + bottom) / 2F, 0); Gui.drawRect(left, top, right, bottom, 0xff333333); GlStateManager.popMatrix(); } diff --git a/src/main/java/malte0811/industrialwires/items/ItemPanelComponent.java b/src/main/java/malte0811/industrialwires/items/ItemPanelComponent.java index 880be06..2db17c7 100644 --- a/src/main/java/malte0811/industrialwires/items/ItemPanelComponent.java +++ b/src/main/java/malte0811/industrialwires/items/ItemPanelComponent.java @@ -53,7 +53,7 @@ import static malte0811.industrialwires.util.NBTKeys.*; public class ItemPanelComponent extends Item implements INetGUIItem { public static final String[] types = { "lighted_button", "label", "indicator_light", "slider", "variac", "toggle_switch", "toggle_switch_covered", - "lock", "panel_meter", SevenSegDisplay.NAME + "lock", "panel_meter", SevenSegDisplay.NAME, "rgb_led" }; public static final String NAME = "panel_component";