Worked on rendering arrows in the GUI

This commit is contained in:
DarkGuardsman 2013-10-24 18:27:01 -04:00
parent 7baf08872d
commit cc37505fe0
9 changed files with 282 additions and 26 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -1,10 +1,14 @@
package dark.api.al.coding;
import java.util.List;
import universalelectricity.core.vector.Vector2;
/** Task in which it doesn't go right to the next task in the row. In this case the task will store
* the entry point, and exit points. As well handle anything in between. Examples are IF statements
* and loops. Do your logic in the refresh method as it should be called each time a new task is
* selected.
*
*
* @author DarkGuardsman */
public interface ILogicTask extends ITask
{
@ -13,6 +17,8 @@ public interface ILogicTask extends ITask
* back to this task. */
public ITask getExitPoint();
public List<Vector2> getExits();
/** Mainly used by the encoder to understand the limit on connections */
public int getMaxExitPoints();

View file

@ -74,7 +74,9 @@ public interface ITask extends Cloneable
DATA("Data"),
DEFINEDPROCESS("Defined Process"),
PROCESS("Process"),
DECISION("Decision");
DECISION("Decision"),
START("Start"),
END("End");
public String name;
private TaskType(String name)

View file

@ -34,7 +34,7 @@ public class GuiEncoderCoder extends GuiEncoderBase
int containerWidth = (this.width - this.xSize) / 2;
int containerHeight = (this.height - this.ySize) / 2;
this.drawTexturedModalRect(containerWidth, containerHeight, 0, 0, this.xSize, this.ySize);
taskListGui.drawConsole(this.mc, (this.width - this.xSize) / 2 + 20, (this.height - this.ySize) / 2 + 40);
taskListGui.drawConsole(this.mc, (this.width - this.xSize) / 2 + 15, (this.height - this.ySize) / 2 + 20);
}
}

View file

@ -1,22 +1,27 @@
package dark.assembly.client.gui;
import java.awt.Color;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
import cpw.mods.fml.client.FMLClientHandler;
import universalelectricity.core.vector.Vector2;
import cpw.mods.fml.client.FMLClientHandler;
import dark.api.al.coding.ILogicTask;
import dark.api.al.coding.IProgram;
import dark.api.al.coding.IRedirectTask;
import dark.api.al.coding.ITask;
import dark.assembly.common.AssemblyLine;
import dark.assembly.common.armbot.Program;
import dark.assembly.common.armbot.command.TaskEnd;
import dark.assembly.common.armbot.command.TaskGOTO;
import dark.assembly.common.armbot.command.TaskGive;
import dark.assembly.common.armbot.command.TaskIF;
import dark.assembly.common.armbot.command.TaskStart;
import dark.core.interfaces.IScroll;
/** Not a gui itself but a component used to display task as a box inside of a gui
@ -27,6 +32,12 @@ public class GuiTaskList extends Gui implements IScroll
protected IProgram program;
protected int scroll = 0;
private final int desiredH = 240;
private final int desiredW = 427;
private final float scale = 0.52f;
private int color = 14737632;
/** The string displayed on this control. */
public String displayString;
@ -36,7 +47,7 @@ public class GuiTaskList extends Gui implements IScroll
{
program = new Program();
program.setTaskAt(new Vector2(0, 0), new TaskGive());
program.setTaskAt(new Vector2(0, 1), new TaskGive());
program.setTaskAt(new Vector2(0, 1), new TaskIF(new Vector2(0, 2), new Vector2(1, 1)));
program.setTaskAt(new Vector2(0, 2), new TaskGive());
program.setTaskAt(new Vector2(0, 3), new TaskGive());
program.setTaskAt(new Vector2(0, 4), new TaskGive());
@ -45,6 +56,25 @@ public class GuiTaskList extends Gui implements IScroll
program.setTaskAt(new Vector2(0, 7), new TaskGive());
program.setTaskAt(new Vector2(0, 8), new TaskGive());
program.setTaskAt(new Vector2(0, 9), new TaskGive());
program.setTaskAt(new Vector2(1, 1), new TaskGive());
program.setTaskAt(new Vector2(1, 2), new TaskIF(new Vector2(1, 3), new Vector2(2, 2)));
program.setTaskAt(new Vector2(1, 3), new TaskGive());
program.setTaskAt(new Vector2(1, 4), new TaskGive());
program.setTaskAt(new Vector2(1, 5), new TaskGive());
TaskGOTO ifEixt = new TaskGOTO();
ifEixt.setExitPoint(0, new Vector2(0, 6));
program.setTaskAt(new Vector2(1, 6), ifEixt);
program.setTaskAt(new Vector2(2, 2), new TaskGive());
program.setTaskAt(new Vector2(2, 3), new TaskGive());
program.setTaskAt(new Vector2(2, 4), new TaskGive());
program.setTaskAt(new Vector2(2, 5), new TaskGive());
program.setTaskAt(new Vector2(2, 6), new TaskGive());
program.setTaskAt(new Vector2(2, 7), new TaskGive());
TaskGOTO ifEixt2 = new TaskGOTO();
ifEixt2.setExitPoint(0, new Vector2(1, 8));
program.setTaskAt(new Vector2(2, 8), ifEixt2);
program.init(null);
}
@ -74,37 +104,39 @@ public class GuiTaskList extends Gui implements IScroll
public void drawConsole(Minecraft minecraft, int x, int y)
{
int spacingY = 25;
int spacingX = 25;
int color = 14737632;
GL11.glPushMatrix();
//With everything scaled the gui will not align like a normal one so use a scaled distance from the main GUI
float scale = 0.52f;
ScaledResolution scaledresolution = new ScaledResolution(minecraft.gameSettings, minecraft.displayWidth, minecraft.displayHeight);
int scaleH = scaledresolution.getScaledHeight();
int scaleW = scaledresolution.getScaledWidth();
this.drawCenteredString(minecraft.fontRenderer, "Scale - " + scaleW + "x " + scaleH + "y", 100, 100, color);
int desiredH = 240;
int desiredW = 427;
//this.drawCenteredString(minecraft.fontRenderer, "Scale - " + scaleW + "x " + scaleH + "y", 100, 100, color);
float sh = (scaleH / desiredH) / scale;
float sW = (scaleW / desiredW) / scale;
spacingY = (int) (spacingY * sh);
spacingX = (int) (spacingX * sW);
int spacingY = (int) (40 * sh);
int spacingX = (int) (40 * sW);
//Start drawing after everying is scaled down
GL11.glScalef(scale, scale, scale);
//TODO add zooming which will involve storing scales with distance translations factors
//Draw lines between tasks
color = Color.BLUE.getRGB();
for (int j = 0; j < 3; j++)
{
for (int i = 0; i < 6; i++)
for (int i = 0; i < 4; i++)
{
int currentLine = i + this.scroll;
if (currentLine <= this.program.getSize().intY() && currentLine >= 0)
int currentLine = i + this.scroll - 1;
if (currentLine <= this.program.getSize().intY() + 1 && currentLine >= -1)
{
ITask task = this.program.getTaskAt(new Vector2(j, currentLine));
if (currentLine == -1 && j == 0)
{
task = new TaskStart();
}
if (currentLine == this.program.getSize().intY() + 1 && j == 0)
{
task = new TaskEnd();
}
if (task != null)
{
if (task instanceof IRedirectTask && !((IRedirectTask) task).render())
@ -130,13 +162,118 @@ public class GuiTaskList extends Gui implements IScroll
case DECISION:
xx = 50;
yy = 50;
uu = 50;
vv = 0;
uu = 0;
vv = 78;
break;
case START:
case END:
xx = 39;
yy = 28;
uu = 0;
vv = 128;
break;
}
Vector2 center = new Vector2(((x + 35) - xx) * sW + (spacingX / 2), (y + 25 - (yy / 2)) * sh + (spacingY * i));
if (task instanceof ILogicTask)
{
for (Vector2 vec : ((ILogicTask) task).getExits())
{
//Task must be close so not to waste a shit ton of line rendering, as well it needs to stay on screen, and only be one column over
if (vec.distanceTo(task.getPosition()) < 5)
{
if (vec.x >= task.getPosition().x)
{
this.drawHorizontalLine(center.intX(), center.intY(), center.intX() + (spacingX / 2), color);
if (vec.y >= task.getPosition().y)
{
this.drawVerticalLine(center.intX() + (spacingX / 2), center.intY(), center.intY() + (spacingY * (vec.intY() - task.getPosition().intY())), color);
}
else if (vec.y < task.getPosition().y)
{
this.drawVerticalLine(center.intX() + (spacingX / 2), center.intY(), center.intY() - (spacingY * (task.getPosition().intY() - vec.intY())), color);
}
}
else if (vec.x < task.getPosition().x)
{
this.drawHorizontalLine(center.intX(), center.intY(), center.intX() - (spacingX / 2), color);
if (vec.y >= task.getPosition().y)
{
this.drawVerticalLine(center.intX() - (spacingX / 2), center.intY(), center.intY() + (spacingY * (vec.intY() - task.getPosition().intY())), color);
}
else if (vec.y < task.getPosition().y)
{
this.drawVerticalLine(center.intX() - (spacingX / 2), center.intY(), center.intY() - (spacingY * (task.getPosition().intY() - vec.intY())), color);
}
}
}
}
}
else
{
this.drawVerticalLine(center.intX(), center.intY(), center.intY() + spacingY, color);
}
}
}
}
}
//Draw icons for task
color = 14737632;
for (int j = 0; j < 3; j++)
{
for (int i = 0; i < 4; i++)
{
int currentLine = i + this.scroll - 1;
if (currentLine <= this.program.getSize().intY() + 1 && currentLine >= -1)
{
ITask task = this.program.getTaskAt(new Vector2(j, currentLine));
if (currentLine == -1 && j == 0)
{
task = new TaskStart();
}
if (currentLine == this.program.getSize().intY() + 1 && j == 0)
{
task = new TaskEnd();
}
if (task != null)
{
if (task instanceof IRedirectTask && !((IRedirectTask) task).render())
{
continue;
}
int xx = 50;
int yy = 39;
int uu = 0;
int vv = 0;
switch (task.getType())
{
case DATA:
break;
case PROCESS:
break;
case DEFINEDPROCESS:
xx = 50;
yy = 39;
uu = 0;
vv = 39;
break;
case DECISION:
xx = 50;
yy = 50;
uu = 0;
vv = 78;
break;
case START:
case END:
xx = 39;
yy = 28;
uu = 0;
vv = 128;
break;
}
FMLClientHandler.instance().getClient().renderEngine.bindTexture(this.TEXTURE_PROCESS);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
Vector2 center = new Vector2(x * sW + (spacingX * j), y * sh + (spacingY * i));
Vector2 center = new Vector2((x + 35 - (xx / 2)) * sW + (spacingX * j), (y + 25 - (yy / 2)) * sh + (spacingY * i));
this.drawTexturedModalRect(center.intX(), center.intY(), uu, vv, xx, yy);
this.drawCenteredString(minecraft.fontRenderer, task.getMethodName(), center.intX() + (xx / 2), center.intY() + ((yy - 8) / 2), color);
}

View file

@ -0,0 +1,18 @@
package dark.assembly.common.armbot.command;
import dark.assembly.common.armbot.TaskBase;
/** @author DarkGuardsman */
public class TaskEnd extends TaskBase
{
public TaskEnd()
{
super("end", TaskType.END);
}
@Override
public TaskBase clone()
{
return new TaskEnd();
}
}

View file

@ -1,5 +1,8 @@
package dark.assembly.common.armbot.command;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.nbt.NBTTagCompound;
import universalelectricity.core.vector.Vector2;
import dark.api.al.coding.IRedirectTask;
@ -12,6 +15,7 @@ public class TaskGOTO extends TaskBase implements IRedirectTask
protected ITask task;
protected Vector2 taskPos;
protected boolean render = true;
protected List<Vector2> exits = new ArrayList<Vector2>();
public TaskGOTO()
{
@ -30,6 +34,21 @@ public class TaskGOTO extends TaskBase implements IRedirectTask
return task;
}
@Override
public void refresh()
{
super.refresh();
if(task == null && taskPos != null)
{
this.task = this.program.getTaskAt(taskPos);
}
this.exits.clear();
if (this.task != null)
{
this.exits.add(this.task.getPosition());
}
}
@Override
public void setExitPoint(int i, ITask task)
{
@ -39,6 +58,14 @@ public class TaskGOTO extends TaskBase implements IRedirectTask
}
}
public void setExitPoint(int i, Vector2 vector2)
{
if (i == 0)
{
this.taskPos = vector2;
}
}
@Override
public int getMaxExitPoints()
{
@ -77,4 +104,11 @@ public class TaskGOTO extends TaskBase implements IRedirectTask
return new TaskGOTO();
}
@Override
public List<Vector2> getExits()
{
// TODO Auto-generated method stub
return exits;
}
}

View file

@ -1,5 +1,8 @@
package dark.assembly.common.armbot.command;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.nbt.NBTTagCompound;
import universalelectricity.core.vector.Vector2;
import dark.api.al.coding.IProgrammableMachine;
@ -12,6 +15,8 @@ public class TaskIF extends TaskBaseLogic
{
protected ITask exitTruePoint = null;
protected ITask exitFalsePoint = null;
protected List<Vector2> exits = new ArrayList<Vector2>();
protected Vector2 exitA, exitB;
protected boolean isTrue = false;
public TaskIF()
@ -29,6 +34,14 @@ public class TaskIF extends TaskBaseLogic
}
public TaskIF(Vector2 exitA, Vector2 exitB)
{
this();
this.exitA = exitA;
this.exitB = exitB;
}
@Override
public void refresh()
{
@ -37,6 +50,24 @@ public class TaskIF extends TaskBaseLogic
{
this.isTrue = this.getArg("check").equals(this.getArg("compare"));
}
if (exitTruePoint == null && exitA != null)
{
exitTruePoint = this.program.getTaskAt(exitA);
}
if (exitFalsePoint == null && exitB != null)
{
exitFalsePoint = this.program.getTaskAt(exitB);
}
this.exits.clear();
if (this.exitFalsePoint != null)
{
this.exits.add(this.exitFalsePoint.getPosition());
}
if (this.exitTruePoint != null)
{
this.exits.add(this.exitTruePoint.getPosition());
}
}
@Override
@ -106,4 +137,10 @@ public class TaskIF extends TaskBaseLogic
return true;
}
@Override
public List<Vector2> getExits()
{
return this.exits;
}
}

View file

@ -0,0 +1,22 @@
package dark.assembly.common.armbot.command;
import dark.assembly.common.armbot.TaskBase;
/** Fake task as the player can not create, edit, or do anything with this task. Its only used to
* allow the gui to render the task as an actual task instance
*
* @author DarkGaurdsman */
public class TaskStart extends TaskBase
{
public TaskStart()
{
super("Start", TaskType.START);
}
@Override
public TaskBase clone()
{
return new TaskStart();
}
}