|
584 | 584 |
|
585 | 585 | bool hit(const ray& r, double tmin, double tmax) const {
|
586 | 586 | for (int a = 0; a < 3; a++) {
|
587 |
| - auto t0 = ffmin((_min[a] - r.origin()[a]) / r.direction()[a], |
588 |
| - (_max[a] - r.origin()[a]) / r.direction()[a]); |
589 |
| - auto t1 = ffmax((_min[a] - r.origin()[a]) / r.direction()[a], |
590 |
| - (_max[a] - r.origin()[a]) / r.direction()[a]); |
591 |
| - tmin = ffmax(t0, tmin); |
592 |
| - tmax = ffmin(t1, tmax); |
| 587 | + auto t0 = fmin((_min[a] - r.origin()[a]) / r.direction()[a], |
| 588 | + (_max[a] - r.origin()[a]) / r.direction()[a]); |
| 589 | + auto t1 = fmax((_min[a] - r.origin()[a]) / r.direction()[a], |
| 590 | + (_max[a] - r.origin()[a]) / r.direction()[a]); |
| 591 | + tmin = fmax(t0, tmin); |
| 592 | + tmax = fmin(t1, tmax); |
593 | 593 | if (tmax <= tmin)
|
594 | 594 | return false;
|
595 | 595 | }
|
|
603 | 603 | [Listing [aabb]: <kbd>[aabb.h]</kbd> Axis-aligned bounding box class]
|
604 | 604 | </div>
|
605 | 605 |
|
606 |
| -Note that we use the simple custom `ffmax()` function (defined in `rtweekend.h`) instead of the C++ |
607 |
| -standard library `fmax()` utility. `ffmax()` is quite a bit faster because it doesn’t worry about |
608 |
| -`NaN`s and other exceptions. |
609 |
| - |
610 | 606 |
|
611 | 607 | An Optimized AABB Hit Method
|
612 | 608 | -----------------------------
|
|
722 | 718 |
|
723 | 719 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
|
724 | 720 | aabb surrounding_box(aabb box0, aabb box1) {
|
725 |
| - point3 small(ffmin(box0.min().x(), box1.min().x()), |
726 |
| - ffmin(box0.min().y(), box1.min().y()), |
727 |
| - ffmin(box0.min().z(), box1.min().z())); |
| 721 | + point3 small(fmin(box0.min().x(), box1.min().x()), |
| 722 | + fmin(box0.min().y(), box1.min().y()), |
| 723 | + fmin(box0.min().z(), box1.min().z())); |
728 | 724 |
|
729 |
| - point3 big(ffmax(box0.max().x(), box1.max().x()), |
730 |
| - ffmax(box0.max().y(), box1.max().y()), |
731 |
| - ffmax(box0.max().z(), box1.max().z())); |
| 725 | + point3 big(fmax(box0.max().x(), box1.max().x()), |
| 726 | + fmax(box0.max().y(), box1.max().y()), |
| 727 | + fmax(box0.max().z(), box1.max().z())); |
732 | 728 |
|
733 | 729 | return aabb(small,big);
|
734 | 730 | }
|
|
2564 | 2560 | vec3 tester(newx, y, newz);
|
2565 | 2561 |
|
2566 | 2562 | for (int c = 0; c < 3; c++) {
|
2567 |
| - min[c] = ffmin(min[c], tester[c]); |
2568 |
| - max[c] = ffmax(max[c], tester[c]); |
| 2563 | + min[c] = fmin(min[c], tester[c]); |
| 2564 | + max[c] = fmax(max[c], tester[c]); |
2569 | 2565 | }
|
2570 | 2566 | }
|
2571 | 2567 | }
|
|
0 commit comments