
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 liikeDevice;
  
    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);

        MouseRotate mouseBeh = new MouseRotate(geoTG);
        geoTG.addChild(mouseBeh);
        mouseBeh.setSchedulingBounds(bounds);
        
 
  
        geoTG.addChild(new ColorCube(.8));
       // geoTG.addChild(new ColorCube(.5));
        objRoot.addChild(geoTG);
        
        Color3f blue = new Color3f(0.f, 0.9f, 0.f);
        Vector3f bluedir  = new Vector3f(0.0f, -8.0f, -8.0f); 
    
         TextureLoader myLoader = new TextureLoader( "c:\\Mike10-1\\digiloop\\floor2.jpg", this );
         ImageComponent2D myImage = myLoader.getImage( );


     //   Color3f bgColor = new Color3f(0.05f, 0.8f, 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);
         
         NavigationBehavior nav = new NavigationBehavior(vpTrans);
         vpTrans.addChild(nav);
         nav.setSchedulingBounds(bounds);
   
         
         vpTrans.addChild(vp);
                
     
         view.attachViewPlatform(vp);
        
        objRoot.addChild(vpTrans);
         return objRoot;
     
   }    
        
    public BasicRecipeJ3D() {
        setLayout(new BorderLayout());
        
        GraphicsConfigTemplate3D g3d = new GraphicsConfigTemplate3D();
        GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getBestConfiguration(g3d);
   
        
        FastrakDriver polhemus = new FastrakDriver();
        System.out.println( "Fastrak opened--" );
        try {
           polhemus.initialize();
        }
        catch( Exception e )
        {
                System.err.println( e.toString() + "\nError initializing Fastrak, exiting... " );
                System.exit(0);
        }
        liikeDevice = new FastrakInputDevice( polhemus );
        liikeDevice.initialize();
        //liikeDevice.setSensitivity( 0.0175f );
       liikeDevice.setSensitivity(0.0175f );

        System.out.println( "Fastrak initialized" );
        
        Canvas3D c = new Canvas3D(gc);
         add("Center", c);
         universe = new VirtualUniverse();
//      universe.getViewer().getPhysicalEnvironment().addInputDevice( liikeDevice );
         
         locale = new Locale(universe);
         PhysicalBody body = new PhysicalBody();
         PhysicalEnvironment environment = new PhysicalEnvironment();
         
         
         environment.addInputDevice(liikeDevice);
         environment.setSensor(0,liikeDevice.getSensor(0)); 
         
         for (int ii=0; ii<environment.getSensorCount(); ii++) {
             System.out.println("Sensor#: " + liikeDevice.getSensor(ii));
        }
     
         environment.setHeadIndex(0);
        
         view = new View();
         view.setTrackingEnable(true);
         view.addCanvas3D(c);
         view.setPhysicalBody(body);
         view.setPhysicalEnvironment(environment);
        // view.setViewPolicy(View.HMD_VIEW);
         System.out.println("enable: " + view.getTrackingEnable());
        // 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();
            
         System.out.println("tracking: " + environment.getTrackingAvailable());
         System.out.println("sensor count: " + environment.getSensorCount());
         
         
      //   s.setSchedulingBounds( new BoundingSphere
       //                ( new Point3d(0.0,0.0,0.0), Float.MAX_VALUE ));
         //scene.addChild( s );
         //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();
        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);
    }
}
