package org.jcae.viewer3d; import java.awt.Color; import java.awt.Point; import java.awt.Rectangle; import javax.media.j3d.*; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import com.sun.j3d.utils.universe.PlatformGeometry; public abstract class SelectionRectangle { /** Display the selection rectangle on a 2D context */ public static class SelectionRectangle2D extends SelectionRectangle implements Runnable { private boolean visible; private Color color; public SelectionRectangle2D(View view) { super(view); } @Override public void setColor(Color color) { this.color=color; } @Override protected void draw(Point anchor, Point point) { //nothing } @Override public void setVisible(boolean b) { this.visible=b; if(b) view.addPostRenderer(this); else view.removePostRenderer(this); } public void run() { J3DGraphics2D g = view.getGraphics2D(); g.setColor(color); g.drawRect(rectangle2D.x, rectangle2D.y, rectangle2D.width, rectangle2D.height); g.flush(true); } @Override public boolean isVisible() { return visible; } } /** * Display the selection rectangle on a 3D context. * It doesn't work because we don't know where to set the rectangle * on the platform geometry. We keep it as a remind. */ public static class SelectionRectangle3D extends SelectionRectangle { private BranchGroup branchGroup=new BranchGroup(); private PlatformGeometry platformGeometry; private ColoringAttributes coloringAttributes=new ColoringAttributes(); private IndexedQuadArray quad; private double[] coordinates = new double[12]; private Point3d p3d1=new Point3d(); private Point3d p3d2=new Point3d(); public SelectionRectangle3D(View view) { super(view); branchGroup.setCapability(BranchGroup.ALLOW_DETACH); platformGeometry=view.getViewingPlatform().getPlatformGeometry(); quad= new IndexedQuadArray(4, GeometryArray.COORDINATES, 4); quad.setCapability(GeometryArray.ALLOW_COORDINATE_WRITE); quad.setCoordinates(0, coordinates); quad.setCoordinateIndices(0, new int[]{0,1,2,3}); Appearance appearance=new Appearance(); PolygonAttributes pa=new PolygonAttributes(); pa.setPolygonMode(PolygonAttributes.POLYGON_LINE); pa.setCullFace(PolygonAttributes.CULL_NONE); appearance.setColoringAttributes(coloringAttributes); appearance.setPolygonAttributes(pa); Shape3D s3d=new Shape3D(); s3d.addGeometry(quad); s3d.setAppearance(appearance); branchGroup.addChild(s3d); coloringAttributes.setCapability(ColoringAttributes.ALLOW_COLOR_WRITE); } @Override public void setVisible(boolean b) { if(b && !isVisible()) platformGeometry.addChild(branchGroup); else if(!b && isVisible()) platformGeometry.removeChild(branchGroup); } @Override public boolean isVisible() { return platformGeometry.indexOfChild(branchGroup)>=0; } @Override public void setColor(Color color) { coloringAttributes.setColor(new Color3f(color)); } @Override protected void draw(Point anchor, Point point) { view.getPixelLocationInImagePlate(anchor.x, anchor.y, p3d1); view.getPixelLocationInImagePlate(point.x, point.y, p3d2); Transform3D t3d=new Transform3D(); /*view.getImagePlateToVworld(t3d); t3d.transform(p3d1); t3d.transform(p3d2);*/ System.out.println(point.x + " " + point.y); System.out.println(p3d1 +" "+ p3d2+ " " + view.where().getScale()+ " "+view.getView().getFrontClipDistance()+" "+view.getView().getFieldOfView()*180/Math.PI); for(int i=0; i<coordinates.length; i++) coordinates[i] = -1; /*p3d1.x=-0.8; p3d1.y=-0.8; p3d2.x=0.8; p3d2.y=0.8;*/ coordinates[0]=p3d1.x; coordinates[1]=p3d1.y; coordinates[3]=p3d2.x; coordinates[4]=p3d1.y; coordinates[6]=p3d2.x; coordinates[7]=p3d2.y; coordinates[9]=p3d1.x; coordinates[10]=p3d2.y; quad.setCoordinates(0, coordinates); } } protected View view; protected Rectangle rectangle2D=new Rectangle(); public SelectionRectangle(View view) { this.view=view; } public Rectangle getGeometry2D() { return rectangle2D; } public abstract void setVisible(boolean b); public abstract boolean isVisible(); public abstract void setColor(Color color); protected abstract void draw(Point anchor, Point point); public void setGeometry(Point anchor, Point point) { rectangle2D.setFrameFromDiagonal(anchor, point); } }