/*
//  ImageMapper - presentation version
//  Eric Decker - 2007/08
//  New Media Design & Imaging - R.I.T.
//  Virtual Entertainment / Jason Arena 
*/

PImage img;

PImage img1;
PImage img2;
PImage img3;
PImage img4;
int thumbSize;
int padding;
int imgDown;

boolean imagePicked;

int objectCount;
boolean trackMouse;
boolean paused;
int randRange;

PFont fontA;

void setup() {
 size(600,600);
 background(0);
 smooth();
 imagePicked = false;
 //images: coins.jpg, flower2.jpg, adirondack2.jpg, fire.jpg
 img1 = loadImage("sourceImages/coins.jpg");
 img2 = loadImage("sourceImages/flower2.jpg");
 img3 = loadImage("sourceImages/adirondack2.jpg");
 img4 = loadImage("sourceImages/fire.jpg");
 //make thumbs:
 thumbSize = 200;
 padding = (width-(thumbSize*2))/3;
 imgDown = 0;
 stroke(255);
 noFill();
 image(img1,padding,padding,thumbSize,thumbSize);
 image(img2,padding*2+thumbSize,padding,thumbSize,thumbSize);
 image(img3,padding,padding*2+thumbSize,thumbSize,thumbSize);
 image(img4,padding*2+thumbSize,padding*2+thumbSize,thumbSize,thumbSize);
 
 objectCount = 0;
 trackMouse = false;
 paused = false;
 
 fontA = loadFont("CourierNew36.vlw");
}

void draw() {
  if (imagePicked == true) {
    //draw:
    if (paused == false) {
      makeImage();
    }
    //show info:
    showInfo();
  }else{
    updateRollovers();
  }
  
  if (keyPressed) {
   //increase random range:
   if (keyCode == UP) {
    randRange+=5;
    println("mouse follow offset set to: "+randRange);  
   }
  //decrease random range:
  if (keyCode == DOWN &&  randRange>0) {
    randRange-=5; 
    println("mouse follow offset set to: "+randRange);  
   } 
  }
}

void keyReleased() {
   // pause
  if (key == 'p' && imagePicked == true) {
   paused = !paused; 
  }
}

void showInfo() {
 noStroke();
 fill(0);
 rect(0,height-14,width,14);
 fill(235);
 textFont(fontA, 12);
 text("lines & circles drawn: "+objectCount,7,height-4);
 if (paused == true) {
 text("*** PAUSED ***",width-110,height-4);
 } 
}

void makeImage() {
   int x;
   int y;
   if (trackMouse == false) {
     x = round(random(0,width));
     y = round(random(0,height));
   }else{
     x = mouseX + round(random(randRange*-1,randRange));
     y = mouseY + round(random(randRange*-1,randRange));
   }
   color pix = img.get(x,y);
   stroke(pix);
   int count = 0;
   //loop thought image pixels:
   for (int w=0; w <width; w++) {
     for (int h=0; h<height; h++) {
       color a = img.get(x,y);
       color b = img.get(w,h);
       if (a == b) {
         noFill();
         ellipse(x,y,4,4);
         stroke(a,25);
         line(x,y,w,h);
         count++;
         objectCount+=2;
       }
     }
   }
   //draw center circle
   stroke(pix,255);
   ellipse(x,y,count,count);
   objectCount++;
}

void mouseReleased() {
  if (imagePicked == false) {
  if (imgDown != 0) {
   //an image is chosen:
    if (imgDown == 1) {
    img = img1;
   }else if (imgDown == 2) {
    img = img2;
   }else if (imgDown == 3) {
    img = img3;
   }else{
    img = img4; 
   }
   background(0);
   imagePicked = true;
  }
  //end follow mouse:
  }else{
   trackMouse = false; 
  }
}

void mousePressed() {
  //pick image
  if (imagePicked == false) {
   imgDown = getThumb();
  }else{
  //follow mouse:  
   trackMouse = true;  
  }
}

int getThumb() {
  if (mouseX > padding && mouseX < padding+thumbSize) {
    //could be either img1 or img3:
    if (mouseY > padding && mouseY < padding+thumbSize) {
     //thumb 1:
     return 1; 
    }else if(mouseY > padding*2+thumbSize && mouseY < height-padding) {
     //thumb 3: 
     return 3; 
    }else{
     //nadda
     return 0; 
    }
  }else if(mouseX > padding*2+thumbSize && mouseX<width-padding) {
   //could be either img2 or img4:
   if (mouseY > padding && mouseY < padding+thumbSize) {
    //thumb 2:
    return 2; 
   }else if(mouseY > padding*2+thumbSize && mouseY < height-padding) {
    //image 4:
    return 4; 
   }else{
    return 0; 
   }
  }else{
    return 0;
  }  
}

void updateRollovers() {
 noFill();
 stroke(0);
 rect(padding,padding,thumbSize,thumbSize);
 rect(padding*2+thumbSize,padding,thumbSize,thumbSize);
 rect(padding,padding*2+thumbSize,thumbSize,thumbSize);
 rect(padding*2+thumbSize,padding*2+thumbSize,thumbSize,thumbSize);
 stroke(255);
 int selected = getThumb();
 if (selected == 1) {
   rect(padding,padding,thumbSize,thumbSize);
 }else if (selected == 2) {
   rect(padding*2+thumbSize,padding,thumbSize,thumbSize);
 }else if (selected == 3) {
   rect(padding,padding*2+thumbSize,thumbSize,thumbSize);
 }else if (selected == 4) {
   rect(padding*2+thumbSize,padding*2+thumbSize,thumbSize,thumbSize);
 }
 
}
/*                           //
//    www.eric-decker.com    //
//    www.jasonarena.com     //
*/                           //
