import java.awt.event.*;
import java.awt.*;
import java.applet.Applet;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube;
import javax.media.j3d.*;
import javax.vecmath.*;


public class StereoTest extends Frame implements ActionListener, WindowListener
{

  Button north, east, south, west;
  Panel controlPanel;
  Panel java3DScenePanel;

  public StereoTest()
  {
  	super("Java, Java3D and Stereo");

	setLayout(new GridLayout(1,2));

	buildControls();
        buildJava3DScenePanel();

	add(controlPanel);
	add(java3DScenePanel);

	setSize(400, 300);
	setVisible(true);

	addWindowListener(this);
  }

  public void buildJava3DScenePanel() {
        java3DScenePanel = new Panel();
        java3DScenePanel.setLayout(new BorderLayout());

        Canvas3D canvas3D = new Canvas3D(null);

        final GraphicsEnvironment theEnvironment =
          GraphicsEnvironment.getLocalGraphicsEnvironment();

        final GraphicsConfiguration[] configs =
          theEnvironment.getDefaultScreenDevice().getConfigurations( );

        final GraphicsConfigTemplate3D configTemplate =
           new GraphicsConfigTemplate3D();

        configTemplate.setStereo(GraphicsConfigTemplate3D.PREFERRED);
        Canvas3D canvasStereo =
          new Canvas3D(configTemplate.getBestConfiguration(configs));

        View stereoView = canvasStereo.getView();
        stereoView.setScreenScale(1);

        PhysicalBody stereoBody = stereoView.getPhysicalBody();
        stereoBody.setLeftEyePosition(new Point3d(-1,0,0));
        stereoBody.setRightEyePosition(new Point3d(1,0,0));

        java3DScenePanel.add("Center", canvasStereo);

        BranchGroup scene = createSceneGraph();

        SimpleUniverse simpleU = new SimpleUniverse(canvasStereo);
        simpleU.getViewingPlatform().setNominalViewingTransform();
        simpleU.addBranchGraph(scene);
  }

  public BranchGroup createSceneGraph() {
	BranchGroup objRoot = new BranchGroup();
	objRoot.addChild(new ColorCube(0.2));
	return objRoot;
  }

  protected void buildControls()
  {
  	controlPanel = new Panel();
	controlPanel.setLayout(new GridLayout(3,3));

	north = new Button("North");
	east = new Button("East");
	south = new Button("South");
	west = new Button("West");

	controlPanel.add(new Label());
	controlPanel.add(north);
	controlPanel.add(new Label());
	controlPanel.add(west);
	controlPanel.add(new Label());
	controlPanel.add(east);
	controlPanel.add(new Label());
	controlPanel.add(south);
	controlPanel.add(new Label());

	north.addActionListener(this);
	west.addActionListener(this);
	east.addActionListener(this);
	south.addActionListener(this);
  }


  public void actionPerformed(ActionEvent e)
  {
  }

  public void windowOpened(WindowEvent e)
  {
  }

  public void windowClosed(WindowEvent e)
  {
  }

  public void windowClosing(WindowEvent e)
  {
  	setVisible(false);
	dispose();
	System.exit(0);
  }

  public void windowDeiconified(WindowEvent e)
  {
  }

  public void windowIconified(WindowEvent e)
  {
  }

  public void windowActivated(WindowEvent e)
  {
  	requestFocus(); // optional
  }

  public void windowDeactivated(WindowEvent e)
  {
  }


  //--- Main program --------------------------------------
  public static void main(String args[])
  {
	  StereoTest stereoTest = new StereoTest();
          stereoTest.show();
  }
}