import SGBackground.*;
import SGCamera.*;
import Tuple.*;
 
//created=16 March 07
//title=Camera Example
//titlebar=Multiple Camera Example
//publish=false
 
int which = 1;
 
Vector cast;
float az = 0, el =0;
 
float jx=0,jy=0;
PImage a,b;
 
float sz = 20;
float cx = 0,cy = 100, cz = 45;
float lx = 0.0, ly = -1, ez = 45;
 
SGCamera cam,trackCam;
KeyMoveCam cam2;
CubeSky sky;
SGCamera currentCam;
float dx, dy;
 
void setup()
{
frameRate(45);
size( 550, 550, P3D);
hint(g.ENABLE_ACCURATE_TEXTURES) ;
a = loadImage("poenderous.png");
b = loadImage("screamPon.png");
 
cast = new Vector();
 
Guy scream = new Guy();
scream.x =0;
scream.y =0;
scream.tex = b;
cast.add(scream);
for (int i=0; i < 20; i++){
cast.add(new Guy());
}
 
ellipseMode(CENTER);
 
cam = new SGCamera(this,-50,-80,-100,0,0,0, SGCamera.UNBOUND, SGCamera.UNBOUND);
cam2 = new KeyMoveCam(this,0,-30,0,0,-30,-20);
trackCam = new SGCamera(this,50,-80,-100,0,0,0, SGCamera.UNBOUND, SGCamera.UNBOUND);
 
PImage [] cubeMap = new PImage[6];
for (int i =0; i < 6; i++){
cubeMap[i] = loadImage("testPattern.jpg");
}
sky = new CubeSky(this, cam,cubeMap);
sky = new CubeSky(this, cam,"uffizi_gallery","png");
}
 
void draw(){
 
sky.draw();
cam2.feed();
 
switch(which){
case 0:
cam.feed();
currentCam = cam;
break;
case 1:
cam2.feed();
currentCam = cam2;
break;
case 2:
trackCam.feed();
currentCam = trackCam;
break;
}
stroke(0);
noFill();
 
cam.render(sz);
cam2.render(sz);
trackCam.render(sz);
 
fill(200,200,220);
 
noStroke();
 
beginShape();
vertex(-500,1,-500);
vertex(-500,1,500);
vertex(500,1,500);
vertex(500,1,-500);
endShape();
 
 
Guy curr;
//two steps. first, we sort
for (int i=0; i < cast.size(); i++){
curr = (Guy)cast.elementAt(i);
curr.calcDist(currentCam.pos);
}
Collections.sort(cast);
for (int i=0; i < cast.size(); i++){
curr = (Guy)cast.elementAt(i);
curr.draw();
}
 
trackCam.setTarget(cam2.pos.x, cam2.pos.y, cam2.pos.z);
 
}
 
 
 
void keyPressed(){
if (key == ' '){
which++;
if (which ==3) which = 0;
}
}
 
 
class Guy implements Comparable{
 
float accum = 0;
 
PImage tex;
float x,y,z;
float camDist = 0;
 
void calcDist(Tuple3f pos){
camDist = (pos.x-x)*(pos.x-x) + (pos.z-z)*(pos.z-z);
}
 
public Guy (){
 
x = random(-300,300);
z = random(-300,100);
//accum = random(0,2*PI);
tex = a;
}
 
void draw(){
textureMode(NORMALIZED);
pushMatrix();
fill(0,7);
rotateX(PI/2);
 
ellipse(x,z,10,10);
ellipse(x,z,20,20);
ellipse(x,z,30,30);
 
rotateX(-PI/2);
 
 
translate( x,-25,z);
rotateY(accum);
 
fill(0,255);
 
beginShape();
texture(tex);
vertex(-10, -25, 0, 0);
vertex(10, -25, 1, 0);
vertex(10, 25, 1, 1);
vertex(-10, 25, 0, 1);
endShape();
 
popMatrix();
 
}
 
int compareTo(Object o){
if (((Guy)o).camDist < camDist) return -1;
else return 1;
}
 
}