import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

import javax.media.j3d.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;

import javax.vecmath.*;

import com.sun.j3d.utils.geometry.ColorCube;

public final class HelloJava3Db
  extends JFrame
{
  private static int WIDTH = 640;
  private static int HEIGHT = 480;
  private static String TITLE = "HelloJava3Db";

  public static void main(String args[])
  {
    HelloJava3Db foo = new HelloJava3Db(args);
  }

  public HelloJava3Db(String args[])
  {
    super(TITLE);

    addWindowListener(new WindowHandler());
    setSize(WIDTH, HEIGHT);
    setBackground(Color.darkGray);

    Canvas3D canvas = new Canvas3D(null);
    getContentPane().add("Center", canvas);

    View view = constructView(canvas);
    Locale locale = constructViewBranch(view);
    constructContentBranch(locale);

    setVisible(true);
  }

  public final static void center(Window w)
  {
    w.pack();
    Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
    w.setLocation((int)(size.getWidth() - w.getWidth()) / 2,
                  (int)(size.getHeight() - w.getHeight()) / 2);
  }

  public final class WindowHandler
    extends WindowAdapter
  {
    public void windowClosing(WindowEvent e)
    {
      System.exit(0);
    }
  }

  private View constructView(Canvas3D canvas)
  {
    View view = new View();
    view.addCanvas3D(canvas);
    view.setPhysicalBody(new PhysicalBody());
    view.setPhysicalEnvironment(new PhysicalEnvironment());
    return view;
  }

  private Locale constructViewBranch(View view)
  {
    VirtualUniverse universe = new VirtualUniverse();
    Locale locale = new Locale(universe);
    BranchGroup branchGroup = new BranchGroup();
    TransformGroup transformGroup = new TransformGroup();
    ViewPlatform viewPlatform = new ViewPlatform();

    transformGroup.addChild(viewPlatform);
    branchGroup.addChild(transformGroup);
    locale.addBranchGraph(branchGroup);

    view.attachViewPlatform(viewPlatform);
    return locale;
  }

  private void constructContentBranch(Locale locale)
  {
    BranchGroup objRoot = new BranchGroup();

    Transform3D transRoot = new Transform3D();
    transRoot.rotX(Math.PI / 4.0d);

    Transform3D temp = new Transform3D();
    temp.rotY(Math.PI / 5.0d);
    transRoot.mul(temp);

    // Finally, translate the scene away from the camera
    transRoot.setTranslation(new Vector3f(0.0f, 0.0f, -4.0f));
    TransformGroup contentTransformGroup = new TransformGroup(transRoot);

    contentTransformGroup.addChild(new ColorCube(0.4));
    objRoot.addChild(contentTransformGroup);

    objRoot.compile();
    locale.addBranchGraph(objRoot);
  }
}