package p5;
import anar.*;




import processing.core.PApplet;

/**
 * first example towards implementing Asynchronous Varitionnal Integrators
 * within the OOG library
 * 
 * implements a variation of the De Casteljau algorithm on a Pts
 * 
 * @author ||lluj!||
 * 
 */
public class TestAvi2d00aFirst extends PApplet {

  /*
   * Example for Anar library by Guillaume LaBelle + Julien Nembrini
   * http://anar.ch
   */


  Obj myObject;

  Pts line;

  public void setup(){

    // size(screen.width,screen.height, P3D);
    size(1000,500,OPENGL);
    // size(1000,500, P3D);
    background(55,33,6);

    myObject = new Obj();


    line = new Pts();

    Pt o = Anar.PtNull(0,0,0);
    Pt a = Anar.PtNull(40,0,40);
    Pt b = Anar.PtNull(80,0,0);
    // Pt c = Anar.PtNull(80,0,80);
    // Pt d = Anar.PtNull(80,100,80);

    line.add(o);
    line.add(a);
    line.add(b);
    // line.add(c);
    // line.add(d);

    // for (int i=0; i<100; i++) {
    // line.add(Anar.PtRnd(100,100,100));
    // }


    myObject.add(line);

    Anar.init(this);

    Anar.drawAxis(true);
    Anar.sliders(a);
    Anar.camTarget(myObject);

    Pts.globalRender = new RenderPtsAll();
    Pt.globalRender = new RenderPtShapeOriented(new AColor(100),new AColor(255,0,0,150),Anar.scene);


  }

  public void draw(){
    background(255);
    myObject.draw();
  }


  void subdivide(){

    // find midpoints of edges
    Pts midPts = new Pts();
    for (int i = 0; i<line.numOfPts()-1; i++){
      Pts tmp = new Pts(line.pt(i),line.pt(i+1));
      midPts.add(new PtBary(tmp));
    }


    // average old points
    Pts newPts = new Pts();
    for (int i = 1; i<line.numOfPts()-1; i++){
      Pts tmp = new Pts(midPts.pt(i-1),midPts.pt(i));
      newPts.add(new PtBary(tmp));
    }

    // construct new line
    Pts newLine = new Pts();

    newLine.add(line.pt(0));
    for (int i = 0; i<newPts.numOfPts(); i++){
      newLine.add(midPts.pt(i));
      newLine.add(newPts.pt(i));
    }
    newLine.add(midPts.ptEnd());
    newLine.add(line.ptEnd());

    line = newLine;

    println(line.numOfPts());

    myObject = new Obj();
    myObject.add(line);
    Anar.slidersReset();
    Anar.sliders(line);

  }


  public void keyPressed(){

    switch(key){
      case 'q':
        subdivide();
      break;
      case ' ':
      break;
      case 'w':
      break;
      case 'm':
      break;
      case 'n':
      break;
      case 'e':
      break;
      case 'p':
        Scene.autoSeek = false;
      break;
      case 'o':
      break;
      case 'r':
      break;
      case 't':
      break;
      case 'a':
        TextIO.write( ((Object)this).getClass().getName()+".lsp",myObject.toAutocad());
      break;
      case 'b':
      break;
      case 'f':
        save("linearSubdiv.jpg");
      break;


    }

  }


}

