import	java.awt.*;
import	javax.vecmath.*;
import	javax.media.j3d.*;

class LineArrayDemo extends Frame
{
	public static void main(String[] args)
	{
		new LineArrayDemo();
	}

	public LineArrayDemo()
	{
		setTitle("LineArrayDemo");

		setLayout(new BorderLayout());
		Canvas3D c = new Canvas3D(null);
		add("Center", c);

		UniverseBuilder u = new UniverseBuilder(c);
		BranchGroup scene = createSceneGraph();
		u.addBranchGraph(scene);

		setSize(300,400);
		show();
	}

	public BranchGroup createSceneGraph()
	{
		BranchGroup branchGroup = new BranchGroup();
		TransformGroup transformGroup = new TransformGroup();
		transformGroup.addChild(new Lines().getShape());
		branchGroup.addChild(transformGroup);
		return branchGroup;
	}
}

class UniverseBuilder extends Object
{
	Locale			locale;

	UniverseBuilder(Canvas3D c)
	{
		Transform3D t = new Transform3D();
		Transform3D t2 = new Transform3D();
		t2.setEuler( new Vector3d(-35.0*(Math.PI/180.0),45.0*(Math.PI/180.0),0.0));
		t.set(4,new Vector3d(6.0,5.0,6.0));
		t.mul(t,t2);

		VirtualUniverse	universe = new VirtualUniverse();
		locale = new Locale(universe);

		PhysicalBody body = new PhysicalBody();
		PhysicalEnvironment environment = new PhysicalEnvironment();
		BranchGroup viewPlatformBranchGroup = new BranchGroup();
		TransformGroup viewPlatformTransformGroup = new TransformGroup(t);
		ViewPlatform viewPlatform = new ViewPlatform();

		View view = new View();
		view.addCanvas3D(c);
		view.setPhysicalBody(body);
		view.setPhysicalEnvironment(environment);
		view.attachViewPlatform(viewPlatform);
		
		viewPlatformTransformGroup.addChild(viewPlatform);
		viewPlatformBranchGroup.addChild(viewPlatformTransformGroup);
		locale.addBranchGraph(viewPlatformBranchGroup);
	}

	void addBranchGraph(BranchGroup bg)
	{
		locale.addBranchGraph(bg);
	}
}

class Lines extends Object
{
	static double verts[] = {
		1.0, -1.0, 1.0, 1.0, -1.0, -1.0,
		-1.0, -1.0, -1.0, -1.0, -1.0,  1.0, 
		1.0, 1.0, 1.0, 1.0, 1.0, -1.0,
		-1.0, 1.0, -1.0, -1.0, 1.0,  1.0, 
	};

	static float[] colors = {
		1.0f, 0.0f, 0.0f,		
		0.0f, 1.0f, 0.0f,		
		0.0f, 0.0f, 1.0f,
		1.0f, 1.0f, 0.0f,

		1.0f, 0.0f, 0.0f,		
		0.0f, 1.0f, 0.0f,		
		0.0f, 0.0f, 1.0f,
		1.0f, 1.0f, 0.0f,
	};

	private Shape3D shape;

	public Lines()
	{
		LineArray lines = new LineArray(8, LineArray.COORDINATES | LineArray.COLOR_3);

		lines.setCoordinates(0, verts);
		lines.setColors(0, colors);

		shape = new Shape3D(lines, new Appearance());
	}

	public Shape3D getShape()
	{
		return shape;
	}
}

