| 204 | */ |
| 205 | |
| 206 | BBox3fa boundSegmentLinear(AffineSpace3fa const& xfm0, |
| 207 | AffineSpace3fa const& xfm1, |
| 208 | BBox3fa const& obbox0, |
| 209 | BBox3fa const& obbox1, |
| 210 | BBox3fa const& bbox0, |
| 211 | BBox3fa const& bbox1, |
| 212 | float tmin, |
| 213 | float tmax) |
| 214 | { |
| 215 | BBox3fa delta(Vec3fa(0.f), Vec3fa(0.f)); |
| 216 | |
| 217 | // loop over bounding box corners |
| 218 | for (int ii = 0; ii < 2; ++ii) |
| 219 | for (int jj = 0; jj < 2; ++jj) |
| 220 | for (int kk = 0; kk < 2; ++kk) |
| 221 | { |
| 222 | Vec3fa p0(ii == 0 ? obbox0.lower.x : obbox0.upper.x, |
| 223 | jj == 0 ? obbox0.lower.y : obbox0.upper.y, |
| 224 | kk == 0 ? obbox0.lower.z : obbox0.upper.z); |
| 225 | Vec3fa p1(ii == 0 ? obbox1.lower.x : obbox1.upper.x, |
| 226 | jj == 0 ? obbox1.lower.y : obbox1.upper.y, |
| 227 | kk == 0 ? obbox1.lower.z : obbox1.upper.z); |
| 228 | |
| 229 | // get extrema of motion of bounding box corner for each dimension |
| 230 | const Vec3fa denom = 2.0 * xfmVector(xfm0 - xfm1, p0 - p1); |
| 231 | const Vec3fa nom = 2.0 * xfmPoint (xfm0, p0) - xfmPoint(xfm0, p1) - xfmPoint(xfm1, p0); |
| 232 | for (int dim = 0; dim < 3; ++dim) |
| 233 | { |
| 234 | if (!(std::abs(denom[dim]) > 0)) continue; |
| 235 | |
| 236 | const float tl = (nom[dim] + (bbox1.lower[dim] - bbox0.lower[dim])) / denom[dim]; |
| 237 | if (tmin <= tl && tl <= tmax) { |
| 238 | const BBox3fa bt = lerp(bbox0, bbox1, tl); |
| 239 | const Vec3fa pt = xfmPoint (lerp(xfm0, xfm1, tl), lerp(p0, p1, tl)); |
| 240 | delta.lower[dim] = std::min(delta.lower[dim], pt[dim] - bt.lower[dim]); |
| 241 | } |
| 242 | const float tu = (nom[dim] + (bbox1.upper[dim] - bbox0.upper[dim])) / denom[dim]; |
| 243 | if (tmin <= tu && tu <= tmax) { |
| 244 | const BBox3fa bt = lerp(bbox0, bbox1, tu); |
| 245 | const Vec3fa pt = xfmPoint(lerp(xfm0, xfm1, tu), lerp(p0, p1, tu)); |
| 246 | delta.upper[dim] = std::max(delta.upper[dim], pt[dim] - bt.upper[dim]); |
| 247 | } |
| 248 | } |
| 249 | } |
| 250 | return delta; |
| 251 | } |
| 252 | |
| 253 | /* |
| 254 | This function calculates the correction for the linear bounds |