package p5;
import anar.*;




import processing.core.PApplet;

public class Test04wDurer 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(1200,800,OPENGL);
    Anar.chy(this);
    Anar.drawAxis(true);

    mechObj.rotateX((float)Math.PI/2);
    trace.render = new RenderPtsLineDotted(new AColor(255,40,50));

    Obj lastPart = new Obj();
    Pts l = new Pts();
    l.add(Anar.Pt(0,0, -10));
    l.add(Anar.Pt(0,0,0));
    l.add(Anar.Pt(10,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 z = new Param(0, -PI*2,PI*2);
      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);
  Face  mechObj = new Star(5,2,10);


  Obj createDurerPart(){

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

    Param t = new Param(3+id*0.01f,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);


    Face mech = new Face(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[]{Test04wDurer.class.getName()});
  }
}

