public ColorRGB rek(Ray ray, Primitive pr, ColorRGB acc, Point3D inter, int count, double oldr) {
if(count < 0)
return acc;
ColorRGB amb = new ColorRGB(pr.getMat().c.red*pr.getMat().amb*(1-(pr.getMat().refl+pr.getMat().refr)),
pr.getMat().c.green*pr.getMat().amb*(1-(pr.getMat().refl+pr.getMat().refr)),
pr.getMat().c.blue*pr.getMat().amb*(1-(pr.getMat().refl+pr.getMat().refr)));
ColorRGB oc = new ColorRGB(pr.getMat().c.red*(1-(pr.getMat().refl+pr.getMat().refr)),
pr.getMat().c.green*(1-(pr.getMat().refl+pr.getMat().refr)),
pr.getMat().c.blue*(1-(pr.getMat().refl+pr.getMat().refr)));
for(int i = 0; i < l.size(); i++) {
if(pr.shadowed(inter, v, l.elementAt(i)) != true) {
acc.add(pr.shade(oc, ray, inter, l.elementAt(i)));
}
else {
acc.add(amb);
}
}
Vector3D normale = new Vector3D(inter.x-pr.getPos().x,inter.y-pr.getPos().y,inter.z-pr.getPos().z);
if(pr.getMat().refl > 0) {
Vector3D toView = new Vector3D(ray.origin.x - inter.x,ray.origin.y - inter.y,ray.origin.z - inter.z);
double winkel = toView.dotProduct(normale);
Vector3D reflect = new Vector3D((-toView.x+2*normale.x*winkel-inter.x),
(-toView.y+2*normale.y*winkel-inter.x),
(-toView.z+2*normale.z*winkel-inter.x));
Ray r2 = new Ray(inter,reflect);
Primitive p2;
Point3D in;
Vector v1 = getNearestIntersection(r2);
in = (Point3D) v1.elementAt(0);
p2 = (Primitive) v1.elementAt(1);
ColorRGB ne = new ColorRGB(0,0,0);
if(p2 != null) {
int co = count-1;
ColorRGB next = rek(r2,p2,acc,in,co,oldr);
ne = new ColorRGB(next.red*pr.getMat().refl,
next.green*pr.getMat().refl,
next.blue*pr.getMat().refl);
acc.add(ne);
}
}
if(pr.getMat().refr > 0) {
double rindex = pr.getMat().brind;
double n = oldr/rindex;
if(inter.inside) {
normale = new Vector3D(normale.x*-1,normale.y*-1,normale.z*-1);
}
double cos1 = -1*ray.direction.dotProduct(normale);
double cos2 = 1.0 - n*n * (1.0 - cos1*cos1);
if(cos2 > 0) {
Vector3D t = new Vector3D(n*ray.direction.x + (n*cos1 - Math.sqrt(cos2))*normale.x,
n*ray.direction.y + (n*cos1 - Math.sqrt(cos2))*normale.y,
n*ray.direction.z + (n*cos1 - Math.sqrt(cos2))*normale.z);
Ray r2 = new Ray(inter,t);
Primitive p2;
Point3D in;
Vector v1 = getNearestIntersection(r2);
in = (Point3D) v1.elementAt(0);
p2 = (Primitive) v1.elementAt(1);
ColorRGB ne = new ColorRGB(0,0,0);
if(p2 != null) {
int co = count-1;
ColorRGB next = rek(r2,p2,acc,in,co,rindex);
ne = new ColorRGB(next.red*pr.getMat().refr,
next.green*pr.getMat().refr,
next.blue*pr.getMat().refr);
ColorRGB absorb = new ColorRGB(pr.getMat().c.red*0.15*-in.dist,
pr.getMat().c.green*0.15*-in.dist,
pr.getMat().c.blue*0.15*-in.dist);
ColorRGB transp = new ColorRGB(Math.exp(absorb.red),
Math.exp(absorb.green),
Math.exp(absorb.blue));
ne = new ColorRGB(ne.red*transp.red,
ne.green*transp.red,
ne.blue*transp.red);
acc.add(ne);
}
}
}
return acc;
}