65 lines
1.6 KiB
C
65 lines
1.6 KiB
C
#include "aabb.h"
|
|
|
|
#include <math.h>
|
|
|
|
bool aabb_hit(const AABB *aabb, Ray r, double t_min, double t_max) {
|
|
/* X */
|
|
{
|
|
double inv_d = 1.0 / r.direction.x;
|
|
double t0 = (aabb->min.x - r.origin.x) * inv_d;
|
|
double t1 = (aabb->max.x - r.origin.x) * inv_d;
|
|
if (inv_d < 0.0) {
|
|
double tmp = t0;
|
|
t0 = t1;
|
|
t1 = tmp;
|
|
}
|
|
t_min = t0 > t_min ? t0 : t_min;
|
|
t_max = t1 < t_max ? t1 : t_max;
|
|
if (t_max <= t_min)
|
|
return false;
|
|
}
|
|
/* Y */
|
|
{
|
|
double inv_d = 1.0 / r.direction.y;
|
|
double t0 = (aabb->min.y - r.origin.y) * inv_d;
|
|
double t1 = (aabb->max.y - r.origin.y) * inv_d;
|
|
if (inv_d < 0.0) {
|
|
double tmp = t0;
|
|
t0 = t1;
|
|
t1 = tmp;
|
|
}
|
|
t_min = t0 > t_min ? t0 : t_min;
|
|
t_max = t1 < t_max ? t1 : t_max;
|
|
if (t_max <= t_min)
|
|
return false;
|
|
}
|
|
/* Z */
|
|
{
|
|
double inv_d = 1.0 / r.direction.z;
|
|
double t0 = (aabb->min.z - r.origin.z) * inv_d;
|
|
double t1 = (aabb->max.z - r.origin.z) * inv_d;
|
|
if (inv_d < 0.0) {
|
|
double tmp = t0;
|
|
t0 = t1;
|
|
t1 = tmp;
|
|
}
|
|
t_min = t0 > t_min ? t0 : t_min;
|
|
t_max = t1 < t_max ? t1 : t_max;
|
|
if (t_max <= t_min)
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
AABB aabb_surrounding_box(const AABB *first, const AABB *second) {
|
|
return (AABB){
|
|
.min = {fmin(first->min.x, second->min.x),
|
|
fmin(first->min.y, second->min.y),
|
|
fmin(first->min.z, second->min.z)},
|
|
.max = {fmax(first->max.x, second->max.x),
|
|
fmax(first->max.y, second->max.y),
|
|
fmax(first->max.z, second->max.z)},
|
|
};
|
|
}
|