import SGGUI.*;
import SGCamera.*;
import Tuple.*;
import SGPhysics.*;
 
static final int NONE = 0;
static final int MOVE = 1;
 
PhysicsEngine engine;
SGCamera cam;
PointAttractor [] planets;
PFont fnt;
SGSlider rate,life,nozzle;
SGSlider p1m,p2m,p3m;
 
SGGUI controller;
VerticalLayout settings;
 
int mouseMode = NONE;
 
int currPlanet = 0;
 
void setup(){
 
size(550,550,P3D);
fnt = loadFont("writing.vlw");
textFont(fnt);
textMode(SCREEN);
planets = new PointAttractor[3];
controller = new SGGUI(this,fnt);
controller.GUI_HIGHLIGHT = color(200,220,200);
settings = new VerticalLayout(controller,10,10,150);
settings.title = "Settings";
rate = new SGSlider( "Rate",1,1,0,10);
life = new SGSlider( "Life",200,5,10,500);
nozzle = new SGSlider( "Nozzle",.1,.01,.01,2);
p1m = new SGSlider( "Red Mass",100,5,1,500);
p2m = new SGSlider( "Green Mass",100,5,1,500);
p3m = new SGSlider( "Blue Mass",100,5,1,500);
settings.add(rate);
settings.add(life);
settings.add(nozzle);
settings.add(p1m);
settings.add(p2m);
settings.add(p3m);
sphereDetail(5);
controller.add(settings);
cam = new SGCamera(this,100,-50,100,0,0,0,SGCamera.ORBIT,SGCamera.DOLLY);
cam.lookAt(0,0,0);
engine = new PhysicsEngine(this);
 
for (int i =0; i < 3; i++){
planets[i] = new PointAttractor(new Tuple3f(random(-50,50),random(-50,50),random(-50,50)),100,engine);
 
engine.addForce(planets[i]);
}
 
}
 
void draw(){
 
planets[0].mass = p1m.getVal();
planets[1].mass = p2m.getVal();
planets[2].mass = p3m.getVal();
for (int i =0; i < rate.getVal(); i++){
engine.addBody(new particle((int)life.getVal()));
}
background(255);
cam.feed();
 
 
 
noStroke();
for (int i =0; i < 3; i++){
pushMatrix();
translate(planets[i].pos.x,planets[i].pos.y,planets[i].pos.z);
if (i == 0) fill(150,0,0);
else if (i ==1 ) fill(0,150,0);
else fill(0,0,150);
 
sphere(1);
popMatrix();
}
 
particle temp;
for (int i =0; i < engine.bodies.size(); i++){
temp = (particle)engine.bodies.elementAt(i);
temp.draw();
}
 
}
 
public void mousePressed(){
 
if (mouseButton == CENTER || mouseMode == MOVE){
 
float mindist = 1e6;
float dx,dy;
float currDist;
for (int i =0; i < planets.length; i++){
dx = screenX(planets[i].pos.x,planets[i].pos.y,planets[i].pos.z)-mouseX;
dy = screenY(planets[i].pos.x,planets[i].pos.y,planets[i].pos.z)-mouseY;
currDist = sqrt(dx*dx + dy*dy);
if (currDist < mindist){
mindist = currDist;
currPlanet = i;
}
}
}
 
}
 
 
 
public void keyPressed(){
mouseMode = MOVE;
cam.setMouseMode(LEFT,SGCamera.UNBOUND);
}
 
public void keyReleased(){
mouseMode = NONE;
cam.setMouseMode(LEFT,SGCamera.ORBIT);
}
 
 
public void mouseDragged(){
 
if (mouseButton == CENTER || mouseMode == MOVE){
planets[currPlanet].pos.plusEquals(cam.right.times((mouseX-pmouseX)));
planets[currPlanet].pos.plusEquals(cam.up.times((mouseY-pmouseY)));
}
}