// Draw an X & Y axis. Draw 4 pts and 4 lines connecting them to form a square
// about the origin. Make the square rotate about the origin.
// Written by Anand B Pillai(anand_pillai@delmia.com)

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 javax.media.j3d.*;
import javax.vecmath.*;

public class DisplayLines extends Applet {

    public BranchGroup createSceneGraph() {

        BranchGroup objRoot = new BranchGroup();
	
        Color3f red = new Color3f(1.0f, 0.0f, 0.0f);
        Color3f blue = new Color3f(0.0f, 1.0f, 0.0f);
        Color3f green = new Color3f(0.0f, 0.0f, 1.0f);
	
        LineArray axisXLines = new LineArray(2, LineArray.COORDINATES);
        objRoot.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));

        LineArray axisYLines = new LineArray(2, LineArray.COORDINATES|LineArray.COLOR_3);
        objRoot.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, green);
        axisYLines.setColor(1, blue);


        TransformGroup objTrans = new TransformGroup();
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRoot.addChild(objTrans);
	
        LineArray testLines = new LineArray(8, LineArray.COORDINATES|LineArray.COLOR_3);
        objTrans.addChild(new Shape3D(testLines));
	
        testLines.setCoordinate(0, new Point3f(-0.5f, -0.5f, 0.0f));
        testLines.setCoordinate(1, new Point3f(-0.5f, 0.5f, 0.0f));
        testLines.setCoordinate(2, new Point3f(-0.5f, 0.5f, 0.0f));
        testLines.setCoordinate(3, new Point3f(0.5f, 0.5f, 0.0f));
        testLines.setCoordinate(4, new Point3f(0.5f, 0.5f, 0.0f));
        testLines.setCoordinate(5, new Point3f(0.5f, -0.5f, 0.0f));
        testLines.setCoordinate(6, new Point3f(0.5f, -0.5f, 0.0f));
        testLines.setCoordinate(7, new Point3f(-0.5f, -0.5f, 0.0f));
	
        for (int i=0; i<8; i++)
            testLines.setColor(i, red);

        /* Hilight the vertices of the square in a yellow color */
	
        PointArray pa = new PointArray(5, PointArray.COORDINATES);
        float coords[] = { -0.5f, -0.5f, 0.0f,
                           -0.5f, 0.5f , 0.0f,
                            0.5f, 0.5f, 0.0f,
                            0.5f, -0.5f, 0.0f,
                           -0.5f, -0.5f, 0.0f };
        pa.setCoordinates(0, coords);
        Appearance app = new Appearance();
        PointAttributes pointAttrs = new PointAttributes();
        pointAttrs.setPointSize(5.0f);
        ColoringAttributes colorAttrs = new ColoringAttributes();
        colorAttrs.setColor(1.0f, 1.0f, 0.0f);
        app.setPointAttributes(pointAttrs);
        app.setColoringAttributes(colorAttrs);
        objTrans.addChild(new Shape3D(pa, app));
	
        Transform3D yAxis = new Transform3D();
        Alpha rotAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
                                   0, 0,
                                   4000, 0, 0,
                                   0, 0, 0);
        RotationInterpolator rotator =
            new RotationInterpolator( rotAlpha, objTrans, yAxis, 0.0f,
                                      (float) Math.PI*2.0f );
        BoundingSphere bounds =
            new BoundingSphere( new Point3d(0.0, 0.0, 0.0), 100.0);
        rotator.setSchedulingBounds(bounds);
        objTrans.addChild(rotator);

        return objRoot;
    }

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

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

        // Create a simple scene and attach it to the virtual universe
        BranchGroup scene = createSceneGraph();
        PickScreen pickit = new PickScreen( scene, c );
        pickit.setRetParam(PickScreen.GET_CLOSEST);
        pickit.setSchedulingBounds( new BoundingSphere(new Point3d(0.0,0.0,0.0),10.0));
        scene.addChild( pickit );
        scene.compile();

        SimpleUniverse u = new SimpleUniverse(c);

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

     public static void main(String[] args) {
        new MainFrame(new DisplayLines(), 256, 256);
    }
}
