package graphics3d;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class BSPTest extends JPanel implements ActionListener {
    double theta = 20;
    double dtheta = 3;
    double phi = 20;
    double dphi = 4;
    double psi = 20;
    double dpsi = 3;
    double nu = 0;
    double dnu = 4;
    javax.swing.Timer timer;
    int interval = 30;

    public BSPTest() {
	super();
	setBackground(Color.white);
	timer = new javax.swing.Timer(interval, this);
    }

    public void actionPerformed(ActionEvent event) {
	theta += dtheta;
	phi += dphi;
	psi += dpsi;
	nu += dnu;
	repaint();
    }

    public void start() {
	if (!timer.isRunning()) timer.start();
    }

    public void stop() {
	if (timer.isRunning()) timer.stop();
    }

    public void paintComponent(Graphics gfx) {
	super.paintComponent(gfx);
	Graphics2D g2 = (Graphics2D) gfx;
	g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
			    RenderingHints.VALUE_ANTIALIAS_ON);
	Graphics3d g = new Graphics3d(g2);
	g.setPixCenter(200, 200);
	g.setPixScale(30, 30);
	double[] eye = new double[] {0, 0, 9, 1};
	g.setEye(eye);

	//	g.printDisplay();

	g.setStroke(new BasicStroke(1.5f, BasicStroke.CAP_SQUARE,
				    BasicStroke.JOIN_MITER, 2));

	g.translate(0, -1, 0);
	g.rotateX(-90);
	g.rotateZ(-60+theta);
	//g.rotateY(-20);
	g.rotateY(-60);


	// draw sphere
	g.setFillColor(new Color(0.5f, 0.5f, 0.5f));
	g.setLightDirection(new double[] {-0.5, 1, 0, 0});
	g.setShadingFunction(new double[] {0.3, 0.5, 1, 1});
	g.setStroke(new BasicStroke(1.4f, BasicStroke.CAP_SQUARE,
				    BasicStroke.JOIN_MITER, 1f));
 	g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
		    RenderingHints.VALUE_ANTIALIAS_ON);
	BinarySpacePartition bsp = new BinarySpacePartition();
	bsp.setColor(Color.blue);

	/*
	bsp.addSurface(Parametrization.ZERO, 
		       new double[] {1.5},
		       -2, -2, 2, 2, 1, 1);
	g.setFillColor(new Color(0.5f, 0.5f, 1f));
	bsp.setColor(Color.red);
	bsp.addSurface(Parametrization.SURFACE1, 
		       new double[] {1.5},
		       -2, -2, 2, 2, 1, 1);
	double[] usereye = g.fromWorld(eye);
	bsp.paint(new double[] {usereye[0], usereye[1], usereye[2], 1}, g);
	//	bsp.paint(eye, g);
	*/

	/*

	bsp.build();
	*/

	bsp.addSurface(Parametrization.MOBIUS,
		       new double[] { },
		       -1, 0, 1, 2*Math.PI, 20, 20);
	bsp.build();
	g.setShowInvisibleFaces(false);
	g.paint(bsp);
	/*
	g.setShowInvisibleFaces(false);
	g.setFillColor(new Color(0.5f, 0.5f, 0.8f));
	g.drawSurfaceWithGouraudShading(Parametrization.MOBIUS,
		       new double[] { },
		       -1, 0, 1, 2*Math.PI, 20, 20);
	*/
    }

    static BSPTest test;
    public static void main(String[] args) {
	test = new BSPTest();
	test.setPreferredSize(new Dimension(400, 400));

	JButton start = new JButton("Start");
	JButton stop = new JButton("Stop");
	//	start.addActionListener(rotate);

	start.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
		    test.start();
		}
	    });

	stop.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
		    test.stop();
		}
	    });

	JPanel bpanel = new JPanel();
	bpanel.add(start);
	bpanel.add(stop);

	JFrame frame = new JFrame("Cube");
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.getContentPane().add(test, BorderLayout.CENTER);
	frame.getContentPane().add(bpanel, BorderLayout.SOUTH);
	frame.pack();
	frame.setVisible(true);
    }
}

