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