import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import java.applet.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.universe.*;

public class prog extends Applet {

   boolean appletFlag = true;
   private static String fname;
   ReadStep r = new ReadStep(fname);
   TransformGroup vpTransGroup;
   View	view;
   BoundingSphere SceneBounds;
   BranchGroup myscene= new BranchGroup();

   public void setAppletFlag(boolean flag) {
      appletFlag = flag;
   }

   public BranchGroup createSceneGraph() {

        Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
        Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
        Color3f red   = new Color3f(1f, 0f, 0f);
        Color3f ambientRed = new Color3f(0.89f, 0.13f, 0.24f);
        Color3f ambient = new Color3f(0.2f, 0.2f, 0.2f);
        Color3f diffuse = new Color3f(0.2f, 0.2f, 0.2f);
        Color3f specular = new Color3f(0.1f, 0.1f, 0.1f);
	      Color3f bgColor = new Color3f(0.16f, 0.48f, 0.72f);

	BranchGroup branchGroup = new BranchGroup();

        // Create a Transformgroup to scale all objects so they
        // appear in the scene.
  TransformGroup objScale = new TransformGroup();
        Transform3D t3d = new Transform3D();
        t3d.setScale(0.2);
        objScale.setTransform(t3d);
        branchGroup.addChild(objScale);

	BoundingSphere bounds =
           new BoundingSphere(new Point3d(), Double.MAX_VALUE);
        BoundingLeaf boundingLeaf = new BoundingLeaf(bounds);
        objScale.addChild(boundingLeaf);

	Background bg = new Background(bgColor);
	bg.setApplicationBounds(bounds);
	objScale.addChild(bg);

        AmbientLight ambLight = new AmbientLight(red);
        ambLight.setInfluencingBounds(bounds);
        objScale.addChild(ambLight);

        Vector3f dir = new Vector3f(-1.0f, -1.0f, 1.0f);
        Vector3f dir1 = new Vector3f(1.0f, 1.0f, 1.0f);
        DirectionalLight dirLight = new DirectionalLight(white, dir);
        dirLight.setInfluencingBounds(bounds);
        objScale.addChild(dirLight);
        DirectionalLight dirLight1 = new DirectionalLight(white, dir1);
        dirLight1.setInfluencingBounds(bounds);
        objScale.addChild(dirLight1);

	TransformGroup transformGroup = new TransformGroup();
   transformGroup.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
   transformGroup.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
   transformGroup.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
   transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
   transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
   transformGroup.addChild(r.getObject());
   myscene.setCapability(BranchGroup.ALLOW_DETACH);
   myscene.setCapability(BranchGroup.ALLOW_BOUNDS_READ);
   objScale.addChild(myscene);
	objScale.addChild(transformGroup);


  Point3d center = new Point3d();
  SceneBounds = (BoundingSphere) myscene.getBounds();
  SceneBounds.getCenter(center);
  System.out.println(center + "   "+SceneBounds.getRadius());

	MouseRotate behavior = new MouseRotate();
	behavior.setTransformGroup(transformGroup);
	transformGroup.addChild(behavior);
	behavior.setSchedulingBounds(bounds);

	MouseZoom behavior2 = new MouseZoom();
	behavior2.setTransformGroup(transformGroup);
	transformGroup.addChild(behavior2);
	behavior2.setSchedulingBounds(bounds);

	MouseTranslate behavior3 = new MouseTranslate();
	behavior3.setTransformGroup(transformGroup);
	transformGroup.addChild(behavior3);
	behavior3.setSchedulingBounds(bounds);

  //branchGroup.compile();

 	return branchGroup;
}

    public void init() {
       setLayout(new BorderLayout());
       Canvas3D canvas = new Canvas3D(null);
	     add("Center", canvas);
       SimpleUniverse u = new SimpleUniverse(canvas);
       ViewingPlatform viewingPlatform = u.getViewingPlatform();
	     vpTransGroup = viewingPlatform.getViewPlatformTransform();
	     Viewer viewer = u.getViewer();
	     view = viewer.getView();
	     BranchGroup scene = createSceneGraph();
    	 /*SimpleUniverse u = new SimpleUniverse(canvas);
       ViewingPlatform viewingPlatform = u.getViewingPlatform();
	     vpTransGroup = viewingPlatform.getViewPlatformTransform();
	     Viewer viewer = u.getViewer();
	     view = viewer.getView();*/
       //scene.setCapability(BranchGroup.ALLOW_DETACH);
       //scene.setCapability(BranchGroup.ALLOW_BOUNDS_READ);
       //SceneBounds = (BoundingSphere) scene.getBounds();

  Transform3D viewTrans = new Transform3D();
	Transform3D eyeTrans = new Transform3D();

	// point the view at the center of the object
 /*	Point3d center = new Point3d();
	SceneBounds.getCenter(center);
	double radius = SceneBounds.getRadius();
  System.out.println("center "+center+"      radij "+radius);
	Vector3d temp = new Vector3d(center);
	viewTrans.set(temp);

	// pull the eye back far enough to see the whole object
	double eyeDist = 1.4*radius / Math.tan(view.getFieldOfView() / 2.0);
	temp.x = 0.0;
	temp.y = 0.0;
	temp.z = eyeDist;
	eyeTrans.set(temp);
	viewTrans.mul(eyeTrans);

	// set the view transform
	vpTransGroup.setTransform(viewTrans);
            */
  u.addBranchGraph(scene);
}

    static class killAdapter extends WindowAdapter {
       public void windowClosing(WindowEvent event) {
          System.exit(0);
       }
    }

    public static void main(String[] args) {
       fname = args[0];
       prog drag = new prog();
       drag.setAppletFlag(false);
       drag.init();

       Frame frame = new Frame("STEP object in Java3D");
       frame.setSize(700, 700);
       frame.add("Center", drag);
       frame.addWindowListener(new killAdapter());
       frame.setVisible(true);
    }
}
