/**
 * Funktionsweise wie Beispiel 2, aber diesmal wird der Poti zum drehen genutzt  
 */


import processing.serial.*;

Serial myPort;  // Create object from Serial class
int val;      // Data received from the serial port
float[] inNumber;

Invader bob;
int bobsize = 280;
int bobparts = 11;

void setup() 
{
  size(500, 500);
  smooth();
  String portName = Serial.list()[1];
  myPort = new Serial(this, portName, 9600);
  myPort.bufferUntil('\n');
  
  bob = new Invader(bobparts);
 }

void draw(){
  background(255);

  if(inNumber != null) {
   bob.col = int(map(inNumber[1],570,919,0,255));                 // set fill to light gray
   pushMatrix();
   translate(width/2,height/2);
   rotate(map(inNumber[0],0,1023,0,TWO_PI));
   bob.render(-bobsize/2,-bobsize/2,bobsize);  
   popMatrix();
  }
}

void serialEvent(Serial myPort) {
  String inString = myPort.readStringUntil('\n');
  if(inString != null) {
    inString = trim(inString);
    inNumber = float(split(inString, ' '));
    }
}

class Invader {
  int[] invaders;

  int invader = 5;
  int invaderDiv = getInvaderDiv(invader);
  int invaderCount = getInvaderCount(invader);
  
  int recursive = 0;

  color col = color(0);
  
  Invader() {    
    init();
  }

  Invader(int i) {
    invader = i;
    invaderDiv = getInvaderDiv(invader);
    invaderCount = getInvaderCount(invader);
    init();  
  }

  Invader(int i, int r) {
    recursive = r;
    invader = i;
    invaderDiv = getInvaderDiv(invader);
    invaderCount = getInvaderCount(invader);
    init();  
  }

  Invader(int i, color c, int r) { 
    recursive = r; 
    col = c; 
    invader = i;
    invaderDiv = getInvaderDiv(invader);
    invaderCount = getInvaderCount(invader);
    init();
  }
  
  void init() {
    invaders = new int[invaderCount];
    for(int i = 0;i<invaderCount;i++) {
      invaders[i] = floor(random(2));
    }  
  }
    
  void render(float x, float y, float s) {   
    
    float blocksize = s / invader;
    int y2 = 0;
    int x2 = 0;
    
    noStroke();
    fill(col);
    
    pushMatrix();
      translate(x+blocksize*(invaderDiv-1),y);
      
      for(int i = 0;i<invaderCount;i++) {
        if(invaders[i] == 1) {        
          if(recursive > 0) {
            Invader in = new Invader(invader-2,recursive-1);
            in.render(x2*blocksize,y2*blocksize,blocksize);           
          } else {
            rect(x2*blocksize,y2*blocksize,blocksize,blocksize);
          }          
        }
        y2++;
        if((i+1)%invader==0) {
          x2++;
          y2 = 0;
        }        
      } 

      x2 = -1;
      y2 = 0;
      for(int i = invader;i<invaderCount;i++) {
        if(invaders[i] == 1) {
        if(recursive > 0) {
          Invader in = new Invader(invader-2,recursive-1);
          in.render(x2*blocksize,y2*blocksize,blocksize);           
        } else {
          rect(x2*blocksize,y2*blocksize,blocksize,blocksize);
        } 
        }
        y2++;
        if((i+1)%invader==0) {
          x2--;
          y2 = 0;
        }        
      }   
    popMatrix();
  }
  
  int getInvaderDiv(float i) {
    return ceil(i/2);
  } 
  
  int getInvaderCount(int i) {
    return i*invaderDiv;
  }
 
}   
   

/* Arduino Code

int potPin = 0;                       
int photoPin = 1;    
void setup() {
  Serial.begin(9600);    
}

void loop() {
  Serial.print(analogRead(potPin));
  Serial.print(" ");  
  Serial.print(analogRead(photoPin));  
  Serial.println();  
  delay(100);                          
}

*/