package p5;
import anar.*;




import java.util.Iterator;

import processing.core.PApplet;


/**
 * @author goo
 */
public class Test02eScreenSpaceMinimalFurious extends PApplet {

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


  

  Face f;

  Obj  myObj = new Obj();


  public void setup(){
    size(800,400,OPENGL);
    Anar.init(this);
    initForm();

    Face.globalRender = new QuakeNoise(10);
    Anar.drawAxis(true);
  }


  void initForm(){

    f = new Star(100,50,6);

    Transform t = new Transform();
    t.translate(0,0,5);
    t.scale(0.98f,0.95f,1);
    t.rotateZ(.1f);

    for (int i = 0; i<50; i++){
      Face tmpFace = new Face(f,t);
      myObj.add(tmpFace);
      f = tmpFace;
    }


    Anar.camTarget(myObj);

  }


  public void draw(){
    background(200);

    myObj.draw();


  }

  class Quake extends RenderFace {

    float cf;

    Quake(float cf){
      this.cf = cf;
    }

    public void draw(Pts pts){
      beginShape();

      Iterator j = pts.iterator();
      while (j.hasNext()){
        Pt pt = (Pt)j.next();
        vertex((float)pt.x()+rnd(),(float)pt.y()+rnd(),(float)pt.z()+rnd());
      }

      endShape(2);// CLOSE
    }

    float rnd(){
      return (float) ((float)Math.random()*cf*2-cf);
    }

  }

  int count;
  int lastFrame = 0;

  public class QuakeNoise extends RenderFace {

    float cf;


    QuakeNoise(float cf){
      this.cf = cf;
    }

    public void draw(Pts pts){
      if(lastFrame!=frameCount){
        count = lastFrame;
        lastFrame = frameCount;
      }

      beginShape();

      Iterator j = pts.iterator();
      while (j.hasNext()){
        Pt pt = (Pt)j.next();
        vertex((float)pt.x()+rnd(),(float)pt.y()+rnd(),(float)pt.z()+rnd());
      }

      endShape(2);// CLOSE
    }

    float rnd(){
      return (float) (noise(count++/100f)*cf*2-cf);
    }

  }


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

}

