
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.Scene;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.io.*;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.behaviors.vp.*;
import com.sun.j3d.utils.geometry.ColorCube;

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

import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.Cone;
 import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.IncorrectFormatException;

import com.sun.j3d.utils.geometry.Primitive;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;

public class BasicRecipeJ3D extends Applet {
  VirtualUniverse universe;
  Locale locale;
  TransformGroup vpTrans;
  View view;
  Bounds bounds;
  // FastrakInputDevice tracker;
  PhysicalBody body;
    public BranchGroup createSceneGraph() {
            // Create the root of the branch graph; this will be returned
        Appearance app = new Appearance();
        BranchGroup objRoot = new BranchGroup();

        TransformGroup geoTG = new TransformGroup();
        geoTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        geoTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        
        
        BoundingSphere bounds =
             new BoundingSphere(new Point3d(0.0,0.0,0.0), 1000.0);
		BoundingSphere bounds2 =
			 new BoundingSphere(new Point3d(5.0,5.4,5.0),1000.0);

        MouseRotate mouseBeh = new MouseRotate(geoTG);
        geoTG.addChild(mouseBeh);
        mouseBeh.setSchedulingBounds(bounds2);
        
 
  
        geoTG.addChild(new ColorCube(2));
	
        objRoot.addChild(geoTG);
        
        Color3f blue = new Color3f(0.f, 0.9f, 0.f);
        Vector3f bluedir  = new Vector3f(0.0f, -8.0f, -8.0f); 
    
 
		  Color3f bgColor = new Color3f(0.9f, 0.9f, 0.0f);
		//   Background bgNode = new Background();
		//	 bgNode.setImage(myImage);
		//	 bgNode.setApplicationBounds(bounds);
		//	 objRoot.addChild(bgNode);
        AmbientLight al = new AmbientLight(true, new Color3f(.5f,.5f, .5f));   
        
        DirectionalLight bluelight = new DirectionalLight(blue, bluedir);
   
        al.setInfluencingBounds(bounds);
        bluelight.setInfluencingBounds(bounds);

        objRoot.addChild(al);

        objRoot.addChild(bluelight);

 
        return objRoot;
     }

     
   public BranchGroup createViewGraph() {
        
         BranchGroup objRoot = new BranchGroup();
        
         Transform3D t = new Transform3D();
         t.setTranslation(new Vector3f(0.0f, 0.0f,10.0f));
         ViewPlatform vp = new ViewPlatform();
         vpTrans = new TransformGroup();
         vpTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
         vpTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
         vpTrans.setTransform(t);
                
         
         DisparityBehavior db = new DisparityBehavior(body);
         
         NavigationBehavior nav = new NavigationBehavior(vpTrans);
         vpTrans.addChild(nav);
         nav.setSchedulingBounds(bounds);
         
         db.setSchedulingBounds(bounds);
         vpTrans.addChild(db);
         
         vpTrans.addChild(vp);
                
     
         view.attachViewPlatform(vp);
        
        objRoot.addChild(vpTrans);
         return objRoot;
     
   }    
        
    public BasicRecipeJ3D() {
        setLayout(new BorderLayout());
        
        GraphicsConfigTemplate3D g3d = new GraphicsConfigTemplate3D();
        g3d.setStereo(GraphicsConfigTemplate3D.REQUIRED);
        GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getBestConfiguration(g3d);
   
    
        Canvas3D c = new Canvas3D(gc);
         add("Center", c);
         universe = new VirtualUniverse();
   
         locale = new Locale(universe);
         body = new PhysicalBody();
         PhysicalEnvironment environment = new PhysicalEnvironment();
         
         view = new View();
         view.setTrackingEnable(true);
         c.setStereoEnable(true);
         System.out.println("stereo enable: " + c.getStereoEnable());
         System.out.println("stereo avialable: " + c.getStereoAvailable());
         view.addCanvas3D(c);
         view.setPhysicalBody(body);
         view.setPhysicalEnvironment(environment);
         
        // Create a simple scene and attach it to the virtual universe

         bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
         BranchGroup scene = createSceneGraph(); 
         
         BranchGroup vgraph = createViewGraph();
         

        locale.addBranchGraph(vgraph);
        locale.addBranchGraph(scene);
    }

    //
    // The following allows HelloUniverse to be run as an application
    // as well as an applet
    //
    public static void main(String[] args) {
        new MainFrame(new BasicRecipeJ3D(), 256, 256);
    }
}

