#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