@Override public synchronized void line(V2 start, V2 end) { // move based on camera position where applicable V2 pov_start = (use_camera) ? camera.getPerspective(start) : start; V2 pov_end = (use_camera) ? camera.getPerspective(end) : end; draw_queue.add( new DrawShape(new Line2D.Float(pov_start.x, pov_start.y, pov_end.x, pov_end.y), false)); // lines are not filled }
@Override public void triangle(V2 a, V2 b, V2 c, boolean fill) { V2 pa = (use_camera) ? camera.getPerspective(a) : a, pb = (use_camera) ? camera.getPerspective(b) : b, pc = (use_camera) ? camera.getPerspective(c) : c; int xpts[] = {(int) pa.x, (int) pb.x, (int) pc.x}, ypts[] = {(int) pa.y, (int) pb.y, (int) pc.y}; draw_queue.add(new DrawShape(new Polygon(xpts, ypts, 3), fill)); }
@Override public synchronized void circle(V2 centre, float radius, boolean fill) { // move based on camera position where applicable V2 pov_centre; if (use_camera) { radius *= camera.getZoom(); pov_centre = camera.getPerspective(centre); } else pov_centre = centre; draw_queue.add( new DrawShape( new Ellipse2D.Float( pov_centre.x - radius, pov_centre.y - radius, radius * 2, radius * 2), fill)); }
// modify the canvas itself @Override public synchronized ICanvas setSize(V2 size) { // reset size this.size = size; // reset camera if (use_camera) camera.setProjectionSize(size); return this; }
@Override public synchronized void box(Rect rect, boolean fill) { // move based on camera position where applicable Rect pov_rect = (use_camera) ? camera.getPerspective(rect).ceil() : rect; draw_queue.add( new DrawShape( new Rectangle2D.Float( pov_rect.x, pov_rect.y, pov_rect.w, pov_rect.h), fill)); }
@Override public synchronized ICanvas setCamera(ICamera camera) { // attach camera and reset its field size this.camera = camera; camera.setProjectionSize(size); // maintain invariant: (camera == null) => use_camera = false if (!use_camera && camera != null) use_camera = true; else if (camera == null) use_camera = false; return this; }
@Override public void angleBox(V2 o, V2 d, float size, boolean fill) { // move based on camera position where applicable V2 po = (use_camera) ? camera.getPerspective(o) : o; // scale direction-vector based on zoom V2 pd = (use_camera) ? d.clone().scale(camera.getZoom() * size) : d.clone().scale(size); int xpts [] = { (int) (po.x + pd.x + pd.y), (int) (po.x + pd.x - pd.y), (int) (po.x + -pd.x - pd.y), (int) (po.x + -pd.x + pd.y) }, ypts [] = { (int) (po.y + -pd.x + pd.y), (int) (po.y + pd.x + pd.y), (int) (po.y + pd.x - pd.y), (int) (po.y + -pd.x - pd.y) }; draw_queue.add(new DrawShape(new Polygon(xpts, ypts, 4), fill)); }
@Override public synchronized void text(String string, V2 position) { // move based on camera position where applicable V2 pov_pos = (use_camera) ? camera.getPerspective(position) : position; draw_queue.add(new DrawText(string, pov_pos)); }
// methods public DrawImage(Rect source, Rect dest, BufferedImage image, ICamera c) { this.source = source; this.dest = (c != null) ? c.getPerspective(dest).ceil() : dest; this.image = image; }