package p5;
import anar.*;




import processing.core.PApplet;

public class Test04wDurerAuto extends PApplet {

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

  boolean isTracing = true;


  Pts     trace     = new Pts();
  Pt      tip;


  public void setup(){

    size(1000,500,OPENGL);
    Anar.chy(this);
    Anar.drawAxis(true);

    createMechanism();
    trace.render = new RenderPtsLineDotted(new AColor(255,40,50));

    Obj lastPart = new Obj();
    Pts l = new Pts();
    l.add(Anar.Pt(10,0, -10));
    l.add(Anar.Pt(0,0, -10));
    l.add(Anar.Pt(0,0,0));

    lastPart.add(l);


    for (int i = 0; i<5; i++){
      Obj part = new Obj();

      // Add previous part
      part.add(lastPart);


      // Place the new part in the direction previous part
      // It is inverted!
      Pts axis = lastPart.lineEnd();

      Param t = new Param(20,0,100);
      Param z = new ParamCycle(0, -PI*2,PI*2,t);
      Anar.sliders.add(z);

      Obj tmp = createDurerPart();
      tmp.rotateX(alph);
      Transform position = new Transform(axis.pt(2),axis.pt(0),axis.pt(1)).rotateY(z);
      position.postTransform = false;
      tmp.apply(position);

      // This part is oriented, then add it to the new part
      part.add(tmp);

      lastPart = part;
    }


    tip = lastPart.lineEnd().pt(2);


    Anar.add(lastPart);
  }

  int   id;

  Param wi    = new Param( -10);
  Param alph  = new Param(PI/2);

  Obj   mechObj;
  float depth = 1;

  void createMechanism(){
    Face mech = new Star(10,4,12);
    mechObj = new Extrude(mech,depth);
    mechObj.translateZ( -depth/2);

    mechObj.rotateX((float)Math.PI/2);
  }


  Obj createDurerPart(){

    Pt origin = Anar.Pt(0,0,0);

    Param t = new Param( (3-id%2)*2+id*0.001f,0,200);
    Param w = new Param(100/ (id+1),0,100);
    Param r = new ParamCycle(0, -PI*2,PI*2,t);
    // Param r = new Param(0, -PI*2,PI*2);

    Anar.sliders.add(t);
    Anar.sliders.add(w);
    Anar.sliders.add(r);

    Obj part = new Obj();

    Pt head = Anar.Pt(origin);
    head.translateZ(w);

    Pt tail = Anar.Pt(origin);
    tail.translateZ(wi);

    Pt rd3 = Anar.Pt(origin);
    rd3.translateX( -10);

    Obj headO = new Cone(1,10);
    headO.translateZ( -10);
    headO.translate(head);

    part.add(headO);


    Obj mech = new Obj(mechObj);
    mech.rotateZ(0);
    part.add(mech);

    Pts l = new Pts();
    l.add(rd3);
    l.add(tail);
    l.add(head);
    l.stroke(160);


    part.add(l);
    part.rotateY(r); // This one is ok


    id++;
    return part;
  }


  public void draw(){
    background(200);
    Anar.main.draw();

    if(isTracing)
      if(trace.numOfPts()==0|| !tip.equalsPt(trace.ptEnd()))
        trace.add(Anar.Pt(tip.x(),tip.y(),tip.z()));

    trace.draw();


  }


  public void keyPressed(){
    isTracing = (isTracing) ? false:true;
    println(isTracing);
  }


  public static void main(String[] args){
    PApplet.main(new String[]{Test04wDurerAuto.class.getName()});
  }
}

