import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.picking.behaviors.*;
import com.sun.j3d.utils.picking.*;
import com.sun.j3d.utils.applet.MainFrame;


public class Virtual
  extends Applet
{
  public Virtual()
  {
    this.setLayout(new GridLayout(1, 3, 0, 0));
    
    GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
    GraphicsConfiguration gc1 = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getBestConfiguration(template);
    
    Canvas3D mainCanvas = new Canvas3D(gc1);
    
    View view = new View();
    
    PhysicalBody physicalBody = new PhysicalBody();
    PhysicalEnvironment physicalEnvironment = new PhysicalEnvironment();
    ViewPlatform viewPlatform = new ViewPlatform();
    
    view.setPhysicalBody(physicalBody);
    view.setPhysicalEnvironment(physicalEnvironment);
    view.attachViewPlatform(viewPlatform);
    view.addCanvas3D(mainCanvas);
    
    
    Transform3D offset = new Transform3D();
    offset.set(new Vector3f(0.0f, 0.0f, 2.0f));
    TransformGroup vpTrans = new TransformGroup(offset);
    vpTrans.addChild(viewPlatform);
    
    BranchGroup vpRoot = new BranchGroup();
    vpRoot.addChild(vpTrans);
    
    BranchGroup sceneRoot = createSceneGraph(mainCanvas);
    
    //*set up universe
    
    VirtualUniverse universe = new VirtualUniverse();
    Locale locale = new Locale(universe);
    
    locale.addBranchGraph(sceneRoot);
    locale.addBranchGraph(vpRoot);
    
    this.add(mainCanvas);
    
  }
  
  public BranchGroup createSceneGraph(Canvas3D canvas)
  {
    BranchGroup objRoot = new BranchGroup();
    TransformGroup objTrans = new TransformGroup();
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    objTrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
    
    objRoot.addChild(objTrans);
    
    objTrans.addChild(new ColorCube(0.4));
    
    BoundingSphere bounds =
    new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
    
    PickRotateBehavior behavior1 = new PickRotateBehavior(objRoot, canvas, bounds);
    objRoot.addChild(behavior1);
    
    PickZoomBehavior behavior2 = new PickZoomBehavior(objRoot, canvas, bounds);
    objRoot.addChild(behavior2);
    
    PickTranslateBehavior behavior3 = new PickTranslateBehavior(objRoot, canvas, bounds);
    objRoot.addChild(behavior3);
    
    objRoot.compile();
    
    return objRoot;
  }
  
  
  public static void main(String args[])
  {
    Frame frame = new MainFrame(new Virtual(), 512, 512);
  }
}