import SGCamera.*;
import Raytracing.*;
import Tuple.*;
 
SGCamera cam;
Raytracer tracer;
 
SolidShader redShader = new SolidShader(color(100,100,120));
 
 
int count = 0;
 
Ray isect = new Ray(60,0,60, random(-1,0), random(-1,0), random(-1,0));
 
void setup(){
 
size(550,550,P3D);
 
tracer = new Raytracer(this);
Tuple3f pnt,edge1,edge2;
for (int i=0; i < 100; i++){
pnt = new Tuple3f(50*random(-1,1),50*random(-1,1),50*random(-1,1));
tracer.add(new Triangle(redShader, pnt,
pnt.plus(new Tuple3f(30*random(-1,1),30*random(-1,1),30*random(-1,1))),
pnt.plus(new Tuple3f(30*random(-1,1),30*random(-1,1),30*random(-1,1))),
0,0,0,0,0,0,null));
}
((KDTree)tracer.accelerator).validate();
frameRate(30);
cam = new SGCamera(this,200,-50,200,0,0,0);
cam.setMouseMode(LEFT,SGCamera.ORBIT);
cam.setMouseMode(RIGHT,SGCamera.DOLLY);
 
}
 
public void draw(){
 
count++;
if (count > 100){
count = 0;
float x = 50*random(-1,1);
float y = 50*random(-1,1);
float z = 50*random(-1,1);
isect = new Ray(x,y,z,-x,-y,-z);
isect.direction.normalize();
}
 
lights();
background(128);
cam.feed();
tracer.draw();
 
RenderState state = new RenderState(isect);
if (tracer.accelerator.findNearest(state)){
Tuple3f hitPoint = state.ray.project(state.distance);
pushMatrix();
translate(hitPoint.x,hitPoint.y,hitPoint.z);
fill(0);
 
sphere(2);
popMatrix();
}
 
isect.draw(g,200);
}
 
void keyPressed(){
float x = 50*random(-1,1);
float y = 50*random(-1,1);
float z = 50*random(-1,1);
isect = new Ray(x,y,z,-x,-y,-z);
isect.direction.normalize();
 
}