package p5;
import anar.*;




import lsys.Grammar;
import processing.core.PApplet;


public class LSys00aCoverLine extends PApplet {

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


  Pts       pts = new Pts();

  Pt        turtle, prev;
  Transform T;
  Translate t;
  Pt        p;
  RotateZ   g, d;

  Grammar   grammar;

  Sliders   mySlide;


  public void setup(){
    size(1000,500,OPENGL);
    Anar.init(this);

    Anar.drawAxis();
    initGrammar();
    initInterpret();
  }

  void initGrammar(){
    grammar = new Grammar("fgfddfgf");
    // here define the rules
    // * means any kind of symbol
    grammar.addRule("*f*","fgfddfgf");

    println(grammar);
  }


  void initInterpret(){
    turtle = Anar.Pt(0,0,0);
    prev = turtle;
    p = Anar.Pt(10,0,0);
    g = new RotateZ(PI/6);
    d = new RotateZ( -PI/6);

    pts = new Pts();
    pts.add(turtle);

    t = new Translate(p);
    T = new Transform(turtle,t);
    drawGrammar();
  }

  void drawGrammar(){
    for (int i = 0; i<grammar.numOfSymbols(); i++){


      switch(grammar.symbol(i).charAt(0)){
        case 'f':
          Pt next = Anar.Pt(turtle,T);
          pts.add(next);
          turtle = next;
          T = new Transform();
          T.add(t);
        break;
        case 'g':
          T.add(new Transform(turtle,g));
        break;
        case 'd':
          T.add(new Transform(turtle,d));
        break;
        default:
        break;

      }
    }
    mySlide = new Sliders(pts);
  }

  public void draw(){
    background(153);
    pts.draw();
    mySlide.draw();
  }


  public void keyPressed(){
    if(key==' '){
      grammar.step();
      drawGrammar();
      println(grammar);
    }
    if(key=='r'){
      grammar.reset();
      println(grammar);

    }
  }

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


}

