import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import javax.media.j3d.*;
import javax.vecmath.*;

/**
Solution to Lab 7 by Rod Harris
*/

public class Lab7
{
	private MyVirtualUniverse vu = new MyVirtualUniverse();

	private double xRot = 0;
	private double yRot = 0;
	private double zRot = 0;
	private double dRot = .05;
	private double rad = 20;


	public static void main(String[] args)
	{
		new Lab7();
	}


	public Lab7()
	{
		ApplicationFrame appFrame = new ApplicationFrame("Lab 7", 800, 600);
		appFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JPanel mainPanel = new JPanel(new BorderLayout());

		mainPanel.add(vu.getBoard(), BorderLayout.CENTER);

		JPanel buttonPanel = new JPanel();

		buttonPanel.add(new JButton(new XIncAction("X +")));
		buttonPanel.add(new JButton(new XDecAction("X -")));
		buttonPanel.add(new JButton(new YIncAction("Y +")));
		buttonPanel.add(new JButton(new YDecAction("Y -")));
		buttonPanel.add(new JButton(new ZIncAction("Z +")));
		buttonPanel.add(new JButton(new ZDecAction("Z -")));
		buttonPanel.add(new JButton(new DefaultAction("Default")));

		mainPanel.add(buttonPanel, BorderLayout.SOUTH);

		appFrame.getContentPane().add(mainPanel);

		addContent();

		update();

		appFrame.setVisible(true);
	}


	public void addContent()
	{
		BranchGroup bg = new BranchGroup();

		bg.addChild(new House());

		vu.addBranchGraph(bg);

		addTree(6, -2, 4, 1);
		addTree(-7, -4, 7, 2);
		addTree(-2, 6, 3, 1);
	}


	public void addTree(double x, double z, double height, double radius)
	{
		BranchGroup bg = new BranchGroup();

		TransformGroup tg = new TransformGroup();

		Transform3D t3d = new Transform3D();

		t3d.set(new Vector3d(x, 0, z));

		tg.setTransform(t3d);

		tg.addChild(new Tree(height, radius));

		bg.addChild(tg);

		vu.addBranchGraph(bg);
	}



	public void update()
	{
		Transform3D rotT3D = new Transform3D();
		rotT3D.setEuler(new Vector3d(xRot, yRot, zRot));

		Transform3D posT3D = new Transform3D();
		posT3D.set(new Vector3d(0, 1, rad));

		Transform3D rotposT3D = new Transform3D();
		rotposT3D.mul(rotT3D, posT3D);

		vu.getViewTG().setTransform(rotposT3D);
	}


	private class XIncAction extends AbstractAction
	{
		public XIncAction(String s)
		{
			super(s);
		}
		public void actionPerformed(ActionEvent e)
		{
			xRot += dRot;
			update();
		}
	}


	private class XDecAction extends AbstractAction
	{
		public XDecAction(String s)
		{
			super(s);
		}
		public void actionPerformed(ActionEvent e)
		{
			xRot -= dRot;
			update();
		}
	}


	private class YIncAction extends AbstractAction
	{
		public YIncAction(String s)
		{
			super(s);
		}
		public void actionPerformed(ActionEvent e)
		{
			yRot += dRot;
			update();
		}
	}


	private class YDecAction extends AbstractAction
	{
		public YDecAction(String s)
		{
			super(s);
		}
		public void actionPerformed(ActionEvent e)
		{
			yRot -= dRot;
			update();
		}
	}


	private class ZIncAction extends AbstractAction
	{
		public ZIncAction(String s)
		{
			super(s);
		}
		public void actionPerformed(ActionEvent e)
		{
			zRot += dRot;
			update();
		}
	}


	private class ZDecAction extends AbstractAction
	{
		public ZDecAction(String s)
		{
			super(s);
		}
		public void actionPerformed(ActionEvent e)
		{
			zRot -= dRot;
			update();
		}
	}


	private class DefaultAction extends AbstractAction
	{
		public DefaultAction(String s)
		{
			super(s);
		}
		public void actionPerformed(ActionEvent e)
		{
			xRot = 0;
			yRot = 0;
			zRot = 0;
			update();
		}
	}
}
