import traer.physics.*;

PFont font;
ParticleSystem physics;

Particle[] p;
Spring[] s;

int maxnum = 26;
int num = 3; // num particles
int spp = 6; // springs per particle
int f = 0;
int bg = 255;

boolean samedistance = true;
    
void setup() {
  size(400, 400);
  fill(0);
  framerate(24);
  textAlign(CENTER);
  ellipseMode(CENTER);        
  physics = new ParticleSystem(0, 0.05);  
  p = new Particle[maxnum];
  font = loadFont("Prototype-20.vlw");
  for (int i=0; i<num; i++) addParticle(i);
  //p[0].makeFixed();
  //p[0].setMass(25);
 
}

void addParticle(int i) {
  int x = int(sin(random(TWO_PI))*(i+1)) + width/2;
  int y = int(cos(random(TWO_PI))*(i+1)) + height/2;
  p[i] = physics.makeParticle(1.0,x,y,0);

  int restLength = samedistance ? width/2 : int(random(width/2));
 
  for (int j=0; j<i; j++) {
     physics.makeSpring(p[i], p[j], 1.0, 0.1, restLength);    
  }
}

void keyPressed() {
  switch (key) {
    case 's': samedistance=!samedistance; break;
    case 'r': resetParticles(); break;
    case 'c': physics.clear(); num=0; break;
    case ' ':
    case '+': if (num<maxnum) addParticle(num++); break;
    case '-': if (num>0) p[--num].kill(); break;
    case CODED: {
      switch (keyCode) {
        case RIGHT: if (num<maxnum) addParticle(num++); break;
        case LEFT: if (num>0) p[--num].kill(); break;
      }
    }
  }
}

void resetParticles() {
  for (int i=0; i<num; i++) {
    int x = int(sin(random(TWO_PI))*(i+0)) + width/2;
    int y = int(cos(random(TWO_PI))*(i+0)) + height/2;
    p[i].moveTo(x,y,p[i].position().z());
  }
}

void draw() {
  background(f);
  fill(bg);

  ellipse(width/2,height/2,width,height);

  
  physics.advanceTime(.1);
 
  for (int i=0; i<num; i++) {
     for (int j=i; j<min(i+spp,num); j++) {
      if (i!=j) {
        stroke(f,25);
        line(p[i].position().x(), p[i].position().y(), p[j].position().x(), p[j].position().y());
      }
    }
  }
  
  for (int i=0; i<num; i++) {
    fill(f);
    textFont(font, 20);
    text(char(i+65), p[i].position().x(), p[i].position().y());
  }
  
  String info = "";
  if (samedistance) info+="s";
  
  fill(bg);
  textFont(font, 20);
  //text(info,8,height-5);
  
  
}