diff -r 7079dcc3bd74 -r 929aad02c5f2 src/scene.cc --- a/src/scene.cc Fri Dec 14 16:51:22 2007 +0100 +++ b/src/scene.cc Mon Dec 17 22:03:50 2007 +0100 @@ -59,21 +59,21 @@ /* http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter3.htm */ bool BBox::intersect(const Ray &ray, Float &a, Float &b) { - Float tnear = -FLT_MAX; - Float tfar = FLT_MAX; - Float t1, t2; + register Float tnear = -Inf; + register Float tfar = Inf; + register Float t1, t2; for (int i = 0; i < 3; i++) { - if (ray.dir.cell[i] == 0) { + if (ray.dir[i] == 0) { /* ray is parallel to these planes */ - if (ray.o.cell[i] < L.cell[i] || ray.o.cell[i] > H.cell[i]) + if (ray.o[i] < L[i] || ray.o[i] > H[i]) return false; } else { /* compute the intersection distance of the planes */ - t1 = (L.cell[i] - ray.o.cell[i]) / ray.dir.cell[i]; - t2 = (H.cell[i] - ray.o.cell[i]) / ray.dir.cell[i]; + t1 = (L[i] - ray.o[i]) / ray.dir[i]; + t2 = (H[i] - ray.o[i]) / ray.dir[i]; if (t1 > t2) swap(t1, t2); @@ -82,10 +82,8 @@ tnear = t1; /* want largest Tnear */ if (t2 < tfar) tfar = t2; /* want smallest Tfar */ - if (tnear > tfar) - return false; /* box missed */ - if (tfar < 0) - return false; /* box is behind ray */ + if (tnear > tfar || tfar < 0) + return false; /* box missed; box is behind ray */ } } @@ -110,6 +108,7 @@ return false; } +/* if there should be CSG sometimes, this may be needed... */ bool Sphere::intersect_all(const Ray &ray, Float dist, vector &allts) const { //allts = new vector(); @@ -167,14 +166,41 @@ bool Box::intersect(const Ray &ray, Float &dist) const { - Float a,b; - if (get_bbox().intersect(ray, a, b) && a < dist) + register Float tnear = -Inf; + register Float tfar = Inf; + register Float t1, t2; + + for (int i = 0; i < 3; i++) { - dist = a; + if (ray.dir[i] == 0) { + /* ray is parallel to these planes */ + if (ray.o[i] < L[i] || ray.o[i] > H[i]) + return false; + } + else + { + /* compute the intersection distance of the planes */ + t1 = (L[i] - ray.o[i]) / ray.dir[i]; + t2 = (H[i] - ray.o[i]) / ray.dir[i]; + + if (t1 > t2) + swap(t1, t2); + + if (t1 > tnear) + tnear = t1; /* want largest Tnear */ + if (t2 < tfar) + tfar = t2; /* want smallest Tfar */ + if (tnear > tfar || tfar < 0) + return false; /* box missed; box is behind ray */ + } + } + + if (tnear < dist) + { + dist = tnear; return true; } - else - return false; + return false; } bool Box::intersect_bbox(const BBox &bbox) const @@ -187,23 +213,50 @@ const Vector3 Box::normal(const Vector3 &P) const { - Vector3 N; - for (int i = 0; i < 3; i++) + register Vector3 l = P - L; + register Vector3 h = H - P; + + if (l.x < h.x) + h.x = -1; + else + { + l.x = h.x; + h.x = +1; + } + + if (l.y < h.y) + h.y = -1; + else { - if (P.cell[i] >= L.cell[i]-Eps && P.cell[i] <= L.cell[i]+Eps) - //if (P.cell[i] == L.cell[i]) - { - N.cell[i] = -1.0; - break; - } - if (P.cell[i] >= H.cell[i]-Eps && P.cell[i] <= H.cell[i]+Eps) - //if (P.cell[i] == H.cell[i]) - { - N.cell[i] = +1.0; - break; - } + l.y = h.y; + h.y = +1; + } + + if (l.z < h.z) + h.z = -1; + else + { + l.z = h.z; + h.z = +1; } - return N; + + if (l.x > l.y) + { + h.x = 0; + if (l.y > l.z) + h.y = 0; + else + h.z = 0; + } + else + { + h.y = 0; + if (l.x > l.z) + h.x = 0; + else + h.z = 0; + } + return h; } #ifdef TRI_PLUCKER