package render; import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.Collection; public abstract class RenderNode { protected Image img; protected Collection<RenderNode> children; protected Collection<RenderNode> bgChildren; public RenderNode() { children = new ArrayList<RenderNode>(); bgChildren = new ArrayList<RenderNode>(); } public RenderNode(Image i) { this(); img = i; } protected abstract void transform(AffineTransform root); public void draw(Graphics2D graphics, RenderPreferences prefs) { if (img != null) { graphics.drawImage(img, -img.getWidth(null) / 2, -img.getHeight(null) / 2, null); } } public void render(Graphics2D graphics, AffineTransform root, RenderPreferences prefs) { transform(root); graphics.setTransform(root); draw(graphics, prefs); for (RenderNode r : bgChildren) { r.render(graphics, (AffineTransform) root.clone(), prefs); } for (RenderNode r : children) { r.render(graphics, (AffineTransform) root.clone(), prefs); } } public boolean interaction(AffineTransform root, MouseEvent e, MouseEventType t) { AffineTransform rootc = (AffineTransform) root.clone(); transform(rootc); if (interacted(rootc, e, t)) { return true; } transform(root); for (RenderNode r : children) { if (r.interaction((AffineTransform) root.clone(), e, t)) { return true; } } return false; } public boolean interacted(AffineTransform root, MouseEvent e, MouseEventType t) { return false; } public void addChild(RenderNode r) { children.add(r); } public void removeChild(RenderNode r) { children.remove(r); } public void addBgChild(RenderNode r) { bgChildren.add(r); } public void removeBgChild(RenderNode r) { bgChildren.remove(r); } public int layer() { return 1; } public static Point2D.Float reverse(AffineTransform root, MouseEvent e) { Point2D.Float src = new Point2D.Float(); src.setLocation(e.getX(), e.getY()); try { root.invert(); } catch (NoninvertibleTransformException e1) { e1.printStackTrace(); } Point2D.Float dest = new Point2D.Float(); root.transform(src, dest); return dest; } }