package net.beadsproject.touch.examples;
import net.beadsproject.touch.event.EnterEvent;
import net.beadsproject.touch.event.Event;
import net.beadsproject.touch.event.EventListener;
import net.beadsproject.touch.event.ExitEvent;
import net.beadsproject.touch.event.SwitchEvent;
import net.beadsproject.touch.old.VoronoiSurface;
import net.beadsproject.touch.perform.PerformNode;
import net.beadsproject.touch.perform.PerformTree;
import net.beadsproject.touch.surface.SurfaceGenerator;
import processing.core.PApplet;

public class SurfaceGenerationAppVoronoi extends PApplet {
	
	VoronoiSurface vs;
	float ox, oy; // old mousex, mousey;	
	
	public class EL implements EventListener
	{
		public void receiveEvent(Event e) {
			if (e instanceof EnterEvent)
			{
				EnterEvent ee = (EnterEvent)e;
				ee.pn().connectRecursive(0);
			}
			else if (e instanceof ExitEvent)
			{
				ExitEvent ee = (ExitEvent)e;		
				ee.pn().disconnectRecursive(0);
			}
			else if (e instanceof SwitchEvent) {
				SwitchEvent se = (SwitchEvent)e;
				PerformNode.switchNodes(se.from(), se.to());
			}
		}
	}
	
	public void setup()
	{
		size(400,400);
		PerformTree pt = ExampleTree.exampleBen2();
		
		vs = SurfaceGenerator.BasicRecursiveVoronoi(pt);
		
		EL el = new EL();
		vs.setEventListener(el);
		
		ox = 0;
		oy = 0;
	}
	
	public void draw()
	{
		background(255);
		stroke(0);
		strokeWeight(1.f/width);
		noFill();
		scale(width,height);		
		vs.draw(this);				
		
		//vs.shiftPoints();
	}
	
	public void mouseMoved()
	{
		float nx = mouseXToWorldX(mouseX);
		float ny = mouseYToWorldY(mouseY);
		
		// notify surface
		vs.mouseMoved(ox,oy,nx,ny);
		
		// update old position
		ox = nx;
		oy = ny;
	}
	
	public float mouseXToWorldX(int x)
	{
		return (float) (1.0*x/width);
	}
	
	public float mouseYToWorldY(int y)
	{
		return (float) (1.0*y/height);
	}
}
