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


public class TestApp extends Applet
{
	Canvas3D canvas;
	SimpleUniverse universe;
	
	public TestApp()
	{
		setLayout(new BorderLayout());
		
		canvas = new Canvas3D(null);
		add("Center", canvas);
		
		universe = new SimpleUniverse(null, 2, canvas, null);
		universe.getViewingPlatform().setNominalViewingTransform();
		universe.getViewer().getView().setBackClipDistance(100);
		
		BranchGroup scene = createSceneGraph();
		
		TransformGroup vpTrans = universe.getViewingPlatform().getViewPlatformTransform();
		
		KeyNavigatorBehavior keyNavBeh = new KeyNavigatorBehavior(vpTrans);
		keyNavBeh.setSchedulingBounds(new BoundingSphere(new Point3d(0, 0, 0), 1000));
		scene.addChild(keyNavBeh);
		
		ViewerAvatar avatar = new ViewerAvatar();
		avatar.addChild(new ColorCube(0.5f));
		CollisionDetector coll = new CollisionDetector(avatar);
		coll.setSchedulingBounds(new BoundingSphere(new Point3d(0, 0, 0), 1000));
		avatar.addChild(coll);
		universe.getViewer().setAvatar(avatar);
		
		scene.compile();
		
		universe.addBranchGraph(scene);
	}
    
	public BranchGroup createSceneGraph()
	{
		BranchGroup root = new BranchGroup();
		root.setCapability(Node.ENABLE_COLLISION_REPORTING);
		
		BranchGroup br1 = new BranchGroup();
		br1.setCapability(Node.ENABLE_COLLISION_REPORTING);
		
		Transform3D tr1 = new Transform3D();
		tr1.rotY(Math.PI/4);
		TransformGroup tg1 = new TransformGroup(tr1);
		tg1.setCapability(Node.ENABLE_COLLISION_REPORTING);
		
		Transform3D tr2 = new Transform3D();
		tr2.setTranslation(new Vector3d(0, 0, -30));
		TransformGroup tg2 = new TransformGroup(tr2);
		tg2.setCapability(Node.ENABLE_COLLISION_REPORTING);
		
		tg2.setCollidable(true);
		//tg2.setBoundsAutoCompute(false);
		tg2.setCapability(Group.ALLOW_COLLISION_BOUNDS_READ);
		tg2.setCapability(Node.ENABLE_COLLISION_REPORTING);
		tg2.setBounds(new BoundingSphere(new Point3d(0,0,0), 100));
		tg2.setCollisionBounds(new BoundingSphere(new Point3d(0,0,0), 100));
		//tg2.setAlternateCollisionTarget(true);
		
		tg2.addChild(tg1);
		
		Shape3D s1 = new ColorCube();
		//s1.setCollidable(false);
		tg1.addChild(s1);
		br1.addChild(tg2);
		root.addChild(br1);
		
		return root;
    }
	
	public static void main(String args[])
	{
		System.out.println("Loading TestApp...");
		MainFrame frame = new MainFrame(new TestApp(), 800, 600);
	}
}