76 lines
1.6 KiB
C
76 lines
1.6 KiB
C
#ifndef AABB_H
|
|
#define AABB_H
|
|
|
|
#include "cglm/struct/vec3.h"
|
|
|
|
typedef struct
|
|
{
|
|
vec3s min;
|
|
vec3s max;
|
|
} aabb_t;
|
|
|
|
inline aabb_t invalid_aabb()
|
|
{
|
|
return (aabb_t){
|
|
.min = {FLT_MAX, FLT_MAX, FLT_MAX},
|
|
.max = {-FLT_MAX, -FLT_MAX, -FLT_MAX},
|
|
};
|
|
}
|
|
|
|
inline void aabb_growth(aabb_t* aabb, vec3s point)
|
|
{
|
|
aabb->min = glms_vec3_minv(aabb->min, point);
|
|
aabb->max = glms_vec3_maxv(aabb->max, point);
|
|
}
|
|
|
|
inline void aabb_growth_min_max(aabb_t* aabb, vec3s min, vec3s max)
|
|
{
|
|
aabb->min = glms_vec3_minv(aabb->min, min);
|
|
aabb->max = glms_vec3_maxv(aabb->max, max);
|
|
}
|
|
|
|
inline bool aabb_eq(aabb_t a, aabb_t b)
|
|
{
|
|
return glms_vec3_eqv(a.min, b.min) && glms_vec3_eqv(a.max, b.max);
|
|
}
|
|
|
|
inline bool aabb_is_valid(aabb_t aabb)
|
|
{
|
|
return aabb.max.x >= aabb.min.x && aabb.max.y >= aabb.min.y && aabb.max.z >= aabb.min.z;
|
|
}
|
|
|
|
inline aabb_t aabb_union(aabb_t a, aabb_t b)
|
|
{
|
|
if (!aabb_is_valid(a) && !aabb_is_valid(b))
|
|
{
|
|
return invalid_aabb();
|
|
}
|
|
else if (!aabb_is_valid(a))
|
|
{
|
|
return b;
|
|
}
|
|
else if (!aabb_is_valid(b))
|
|
{
|
|
return a;
|
|
}
|
|
|
|
aabb_t result;
|
|
result.min = glms_vec3_minv(a.min, b.min);
|
|
result.max = glms_vec3_maxv(a.max, b.max);
|
|
return result;
|
|
}
|
|
|
|
inline float aabb_surface_area(aabb_t aabb)
|
|
{
|
|
vec3s extent = glms_vec3_sub(aabb.max, aabb.min);
|
|
return 2.0f * (extent.x * extent.y + extent.x * extent.z + extent.y * extent.z);
|
|
}
|
|
|
|
inline float aabb_volume(aabb_t aabb)
|
|
{
|
|
vec3s extent = glms_vec3_sub(aabb.max, aabb.min);
|
|
return extent.x * extent.y * extent.z;
|
|
}
|
|
|
|
#endif // AABB_H
|