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
00026 #include "stdafx.h"
00027 #include "geometry.h"
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
00041
00042 BBox Union(const BBox &b, const BBox &b2) {
00043 BBox ret;
00044 ret.pMin.x = min(b.pMin.x, b2.pMin.x);
00045 ret.pMin.y = min(b.pMin.y, b2.pMin.y);
00046 ret.pMin.z = min(b.pMin.z, b2.pMin.z);
00047 ret.pMax.x = max(b.pMax.x, b2.pMax.x);
00048 ret.pMax.y = max(b.pMax.y, b2.pMax.y);
00049 ret.pMax.z = max(b.pMax.z, b2.pMax.z);
00050 return ret;
00051 }
00052
00053
00054 void BBox::BoundingSphere(Point *c, float *rad) const {
00055 *c = .5f * pMin + .5f * pMax;
00056 *rad = Inside(*c) ? Distance(*c, pMax) : 0.f;
00057 }
00058
00059
00060 bool BBox::IntersectP(const Ray &ray, float *hitt0,
00061 float *hitt1) const {
00062 float t0 = ray.mint, t1 = ray.maxt;
00063 for (int i = 0; i < 3; ++i) {
00064
00065 float invRayDir = 1.f / ray.d[i];
00066 float tNear = (pMin[i] - ray.o[i]) * invRayDir;
00067 float tFar = (pMax[i] - ray.o[i]) * invRayDir;
00068
00069
00070 if (tNear > tFar) swap(tNear, tFar);
00071 t0 = tNear > t0 ? tNear : t0;
00072 t1 = tFar < t1 ? tFar : t1;
00073 if (t0 > t1) return false;
00074 }
00075 if (hitt0) *hitt0 = t0;
00076 if (hitt1) *hitt1 = t1;
00077 return true;
00078 }
00079
00080