00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "geometry.h"
00025
00026 namespace lux
00027 {
00028
00029
00030 BBox Union(const BBox &b, const Point &p) {
00031 BBox ret = b;
00032 ret.pMin.x = min(b.pMin.x, p.x);
00033 ret.pMin.y = min(b.pMin.y, p.y);
00034 ret.pMin.z = min(b.pMin.z, p.z);
00035 ret.pMax.x = max(b.pMax.x, p.x);
00036 ret.pMax.y = max(b.pMax.y, p.y);
00037 ret.pMax.z = max(b.pMax.z, p.z);
00038 return ret;
00039 }
00040 BBox Union(const BBox &b, const BBox &b2) {
00041 BBox ret;
00042 ret.pMin.x = min(b.pMin.x, b2.pMin.x);
00043 ret.pMin.y = min(b.pMin.y, b2.pMin.y);
00044 ret.pMin.z = min(b.pMin.z, b2.pMin.z);
00045 ret.pMax.x = max(b.pMax.x, b2.pMax.x);
00046 ret.pMax.y = max(b.pMax.y, b2.pMax.y);
00047 ret.pMax.z = max(b.pMax.z, b2.pMax.z);
00048 return ret;
00049 }
00050
00051 }
00052
00053 using namespace lux;
00054
00055 void BBox::BoundingSphere(Point *c, float *rad) const {
00056 *c = .5f * pMin + .5f * pMax;
00057 *rad = Inside(*c) ? Distance(*c, pMax) : 0.f;
00058 }
00059 bool BBox::IntersectP(const Ray &ray, float *hitt0,
00060 float *hitt1) const {
00061 float t0 = ray.mint, t1 = ray.maxt;
00062 for (int i = 0; i < 3; ++i) {
00063
00064 float invRayDir = 1.f / ray.d[i];
00065 float tNear = (pMin[i] - ray.o[i]) * invRayDir;
00066 float tFar = (pMax[i] - ray.o[i]) * invRayDir;
00067
00068 if (tNear > tFar) swap(tNear, tFar);
00069 t0 = tNear > t0 ? tNear : t0;
00070 t1 = tFar < t1 ? tFar : t1;
00071 if (t0 > t1) return false;
00072 }
00073 if (hitt0) *hitt0 = t0;
00074 if (hitt1) *hitt1 = t1;
00075 return true;
00076 }