import javax.media.j3d.*;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.loaders.objectfile.*;
import com.sun.j3d.loaders.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import com.sun.j3d.utils.geometry.*;

import com.sun.j3d.utils.picking.*;



import javax.vecmath.*;
import java.awt.*;

import com.sun.j3d.utils.behaviors.vp.*;

import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;

public class PickTest extends Applet
{
    private Canvas3D m_canvas;
    private Locale m_locale;

    public PickTest()
    {

    }

    private Shape3D createPointArray()
    {
        float[] coords = {-0.3f, 0f, 0f, 0.0f, 0f, 0f, 0.3f, 0f, 0f};
        PointArray pointArr = new PointArray(coords.length/3, PointArray.COORDINATES);

        pointArr.setCoordinates(0, coords);

        Shape3D pointShape = new Shape3D(pointArr);

        pointArr.setCapability(GeometryArray.ALLOW_COORDINATE_READ);
        pointArr.setCapability(GeometryArray.ALLOW_COUNT_READ);
        pointArr.setCapability(GeometryArray.ALLOW_FORMAT_READ);
        pointShape.setCapability(Shape3D.ALLOW_GEOMETRY_READ);

        return (pointShape);
    }

    private void attachPickBehavior()
    {
        m_canvas.addMouseListener(new MouseAdapter()
        {
            public void mouseClicked(MouseEvent me)
            {
                System.out.println("in mouse clicked");

                final PickCanvas pickCanvas = new PickCanvas(m_canvas, m_locale);
                pickCanvas.setMode(PickTool.GEOMETRY_INTERSECT_INFO);
                //pickCanvas.setTolerance(50.0f);
                pickCanvas.setShapeLocation(me);

                Point3d eyePos = pickCanvas.getStartPosition();

                //Math.toDegrees(((PickConeRay)pickCanvas.getPickShape()).s);

//                Point3d origin = new Point3d();
//                ((PickConeRay)pickCanvas.getPickShape()).getOrigin(origin);

                Vector3d direction = new Vector3d();
//                ((PickConeRay)pickCanvas.getPickShape()).getDirection(direction);


//                ((PickConeRay)pickCanvas.getPickShape()).set(origin, direction, Math.toRadians(5));

                Point3d p3d = new Point3d();

                m_canvas.getPixelLocationInImagePlate(me.getX(), me.getY(), p3d);

                Transform3D temp = new Transform3D();
                m_canvas.getImagePlateToVworld(temp);
                temp.transform(p3d);

//                direction.x = direction.x - p3d.x;
//                direction.y = direction.y - p3d.y;
//                direction.z = direction.z - p3d.z;

                direction.x = 0;
                direction.y = 0;
                direction.z = -p3d.z;

                System.out.println("origin : " + p3d);
                System.out.println("direction : " + direction);

                pickCanvas.setShapeCylinderRay(p3d, direction, 0.2f);

                PickResult pickResult = pickCanvas.pickClosest();

                if (pickResult != null)
                {
                    System.out.println("in pick result");

                    PickIntersection pickIntersection = pickResult.getClosestIntersection(eyePos);

                    if (pickIntersection != null)
                    {
                        Point3d p3d1 = pickIntersection.getClosestVertexCoordinates();

                        System.out.println("p3d1 : " + p3d1);
                    }
                }
            }
        });
    }

    public void init()
    {
            createVirtualUniverse();
    }

    private BranchGroup buildContentBranch( )
        {
                BranchGroup objRoot = new BranchGroup( );

                TransformGroup objTrans = new TransformGroup( );
                objTrans.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
                objTrans.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );

                objRoot.addChild(objTrans);

        objTrans.addChild(createPointArray());

                return objRoot;
        }
    public void createVirtualUniverse()
    {
        GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
        GraphicsConfiguration config = GraphicsEnvironment.getLocalGraphicsEnvironment().
                                        getDefaultScreenDevice().getBestConfiguration(template);

        m_canvas = new Canvas3D(config);

        BranchGroup contentBranch = buildContentBranch();

        addCanvas(m_canvas);

        SimpleUniverse simpleUniv = new SimpleUniverse(m_canvas);
        simpleUniv.getViewingPlatform().setNominalViewingTransform();
        m_locale = simpleUniv.getLocale();

        attachOrbitBehaviour(simpleUniv, m_canvas);

        attachPickBehavior();

        simpleUniv.addBranchGraph(contentBranch);
    }

    private void addCanvas(Canvas3D theCanvas)
    {
        setLayout(new BorderLayout());
        add("Center", theCanvas);
    }

    private void attachOrbitBehaviour(SimpleUniverse theUniv, Canvas3D theCanvas)
    {
        OrbitBehavior orbit = new OrbitBehavior(theCanvas, OrbitBehavior.REVERSE_ALL);
        orbit.setReverseZoom(false);
            BoundingSphere bounds =
                            new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
            orbit.setSchedulingBounds(bounds);
            theUniv.getViewingPlatform().setViewPlatformBehavior(orbit);
    }

    public static void main(String[] args)
    {
            new MainFrame(new PickTest(), 700, 500);
    }
}