package shipmaker.partplacer;
import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import dcpu.WorldPauseHandler;
import physics.XYTSource;
import render.RenderNode;
import render.RenderPreferences;
import render.XYTRenderNode;
import shipmaker.BlueprintLocation;
import shipmaker.knobs.PositionKnob;
import shipmaker.knobs.RadiusKnob;
import shipmaker.knobs.T1Knob;
import shipmaker.knobs.T2Knob;
import env.Entity;
public class BlueprintPositionEditor implements Entity {
private static final BasicStroke normal = new BasicStroke(1,
BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
private static final BasicStroke dashed = new BasicStroke(1f,
BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER, 10f,
new float[] { 2f }, 0f);
private class BPLBaseNode extends RenderNode {
BPLBaseNode() {
this.addChild(new PositionKnob(BlueprintPositionEditor.this));
this.addChild(new T1Knob(BlueprintPositionEditor.this) );
this.addChild(new T2Knob(BlueprintPositionEditor.this) );
this.addChild(new BPLAngleNode());
}
protected void transform(AffineTransform root) {
}
public void draw(Graphics2D g, RenderPreferences prefs) {
g.setStroke(dashed);
g.setColor(prefs.borderColor().brighter());
g.drawLine(0, 0, 0, (int) bpl.y);
g.drawLine(0, (int) bpl.y, (int) bpl.x, (int) bpl.y);
if (bpl.r >= 20) {
g.setStroke(normal);
g.drawLine((int) bpl.x, (int) bpl.y, (int) bpl.x + 20,
(int) bpl.y);
}
int size = 8;
int threshold = 20;
int rbx = 0, rby = 0;
if (bpl.x < -threshold) {
rbx = -10;
}
if (bpl.x > threshold) {
rbx = 10;
}
if (bpl.y < -threshold) {
rby = (int) (bpl.y + size);
}
if (bpl.y > threshold) {
rby = (int) (bpl.y - size);
}
if (rby != 0 && rbx != 0) {
g.setStroke(new BasicStroke(1));
g.drawLine(0, rby, rbx, rby);
g.drawLine(rbx, rby, rbx, (int)bpl.y);
}
}
public int layer() {
return 2;
}
}
private class BPLAngleNode extends XYTRenderNode implements
XYTSource {
public BPLAngleNode() {
super(null);
this.src = this;
this.addChild(new RadiusKnob(BlueprintPositionEditor.this));
addChild(new BPLAlignmentNode());
}
public float position_x() {
return bpl.x;
}
public float position_y() {
return bpl.y;
}
public float alignment_theta() {
return bpl.t1;
}
public void draw(Graphics2D g, RenderPreferences prefs) {
g.setColor(prefs.borderColor().brighter());
g.setStroke(dashed);
g.drawLine(0, 0, (int) bpl.r, 0);
if (bpl.r >= 20) {
g.setStroke(normal);
int rad = 20;
g.drawArc(-rad, -rad, 2 * rad, 2 * rad, 0,
(int) (180 * bpl.t1 / Math.PI));
}
g.setStroke(normal);
g.drawLine((int) bpl.r, 0, (int) bpl.r + 20, 0);
}
public int layer() {
return 2;
}
}
private class BPLAlignmentNode extends XYTRenderNode implements
XYTSource {
public BPLAlignmentNode() {
super(null);
this.src = this;
}
public float position_x() {
return bpl.r;
}
public float position_y() {
return 0;
}
public float alignment_theta() {
return bpl.t2;
}
public void draw(Graphics2D g, RenderPreferences prefs) {
g.setStroke(normal);
g.setColor(prefs.borderColor().brighter());
g.drawArc(-20, -20, 40, 40, 0, (int) (bpl.t2 * 180 / Math.PI));
g.drawLine(0, 0, 20, 0);
}
public int layer() {
return 2;
}
}
BlueprintLocation bpl;
BPLBaseNode base;
public BlueprintPositionEditor(BlueprintLocation bpl) {
this.bpl = bpl;
base = new BPLBaseNode();
}
public void tickInternals(int msPerTick, WorldPauseHandler handler) {
}
public void tickPhysics(int msPerTick, WorldPauseHandler handler) {
}
public RenderNode getVisuals() {
return base;
}
public BlueprintLocation bpl() {
return bpl;
}
public void bpl(BlueprintLocation location) {
bpl = location;
}
}