import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame; 
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.mouse.*;


public class AxisApp extends Applet {

    /////////////////////////////////////////////////
    //
    // create graph branch group
    //
    public class Axis{

        private BranchGroup axisBG;

        ////////////////////////////////////////////
        //
        // create axis subgraph
        //
        public Axis() {
	
            axisBG = new BranchGroup();
            
            
                TransformGroup objRotate = new TransformGroup();
        objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);

            

            // create line for X axis
            LineArray axisXLines = new LineArray(2, LineArray.COORDINATES | LineArray.COLOR_3 );
            objRotate.addChild(new Shape3D(axisXLines));

            axisXLines.setCoordinate(0, new Point3f(-1.0f, 0.0f, 0.0f));
            axisXLines.setCoordinate(1, new Point3f( 1.0f, 0.0f, 0.0f));

            Color3f red   = new Color3f(1.0f, 0.0f, 0.0f);
            Color3f green = new Color3f(0.0f, 1.0f, 0.0f);
            Color3f blue  = new Color3f(0.0f, 0.0f, 1.0f);
            
            axisXLines.setColor(0,red);
            axisXLines.setColor(1,red);

            // create line for Y axis
            LineArray axisYLines = new LineArray(2, 
                LineArray.COORDINATES | LineArray.COLOR_3 );
            objRotate.addChild(new Shape3D(axisYLines));

            axisYLines.setCoordinate(0, new Point3f( 0.0f,-1.0f, 0.0f));
            axisYLines.setCoordinate(1, new Point3f( 0.0f, 1.0f, 0.0f));

            axisYLines.setColor(0, red);
            axisYLines.setColor(1, red);
            

            // create line for Z axis
          LineArray axisZLines = new LineArray(2, 
                          LineArray.COORDINATES  | LineArray.COLOR_3);
              objRotate.addChild(new Shape3D(axisZLines));

              axisZLines.setCoordinate(0, new Point3f(0.0f, 0.0f,  -1.0f));
              axisZLines.setCoordinate(1, new Point3f(0.0f, 0.0f,  1.0f));
             
        axisZLines.setColor(0, red);
              axisZLines.setColor(1, red);

            
            LineArray Linea1 = new LineArray(2, LineArray.COORDINATES);
            objRotate.addChild(new Shape3D(Linea1));

            Linea1.setCoordinate(0, new Point3f(0.0f, 0.0f, 0.0f));
            Linea1.setCoordinate(1, new Point3f( 0.0f, 0.2f, 0.0f));
            
            LineArray Linea2 = new LineArray(2, LineArray.COORDINATES);
            objRotate.addChild(new Shape3D(Linea2));

            Linea2.setCoordinate(0, new Point3f(0.0f, 0.2f, 0.0f));
            Linea2.setCoordinate(1, new Point3f( -0.2f, 0.2f, 0.0f));
            
             LineArray Linea3 = new LineArray(2, LineArray.COORDINATES);
            objRotate.addChild(new Shape3D(Linea3));

            Linea3.setCoordinate(0, new Point3f(-0.2f, 0.2f, 0.0f));
            Linea3.setCoordinate(1, new Point3f( -0.2f, 0.2f, 0.8f));

      LineArray Linea4 = new LineArray(2, LineArray.COORDINATES);
            objRotate.addChild(new Shape3D(Linea4));

            Linea4.setCoordinate(0, new Point3f(-0.2f, 0.2f, 0.8f));
            Linea4.setCoordinate(1, new Point3f( 0.6f, 0.2f, 0.8f));

       LineArray Linea5 = new LineArray(2, LineArray.COORDINATES);
            objRotate.addChild(new Shape3D(Linea5));

            Linea5.setCoordinate(0, new Point3f(0.6f, 0.2f, 0.8f));
            Linea5.setCoordinate(1, new Point3f( 0.6f, 0.2f, -0.2f));
            
            
             axisBG.addChild(objRotate);
              
        MouseRotate myMouseRotate = new MouseRotate();
        myMouseRotate.setTransformGroup(objRotate);
        myMouseRotate.setSchedulingBounds(new BoundingSphere());
        axisBG.addChild(myMouseRotate);


                    
        } // end of axis constructor	

        public BranchGroup getBG(){
            return axisBG;
        }

    } // end of class Axis

    /////////////////////////////////////////////////
    //
    // create scene graph branch group
    //
    public BranchGroup createSceneGraph() {

        BranchGroup objRoot = new Axis().getBG();

        // Let Java 3D perform optimizations on this scene graph.
        objRoot.compile();

        return objRoot;
    } // end of CreateSceneGraph method of yoyo1

    // Create a simple scene and attach it to the virtual universe

    public AxisApp() {
        setLayout(new BorderLayout());
        GraphicsConfiguration config =
           SimpleUniverse.getPreferredConfiguration();

        Canvas3D canvas3D = new Canvas3D(config);
        add("Center", canvas3D);

        BranchGroup scene = createSceneGraph();

        // SimpleUniverse is a Convenience Utility class
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);

        // This will move the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        simpleU.getViewingPlatform().setNominalViewingTransform();

        simpleU.addBranchGraph(scene);
    } // end of coneyoyo constructor

    //  The following allows this to be run as an application
    //  as well as an applet

    public static void main(String[] args) {
        Frame frame = new MainFrame(new AxisApp(), 500, 500);
    } // end of main method of axisapp

} // end of class axisap