126 lines
2.9 KiB
C++
126 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include "Library.h"
|
|
|
|
#include <glm/vec3.hpp>
|
|
|
|
namespace CesiumGeometry {
|
|
|
|
/**
|
|
* @brief An Axis-Aligned Bounding Box (AABB), where the axes of the box are
|
|
* aligned with the axes of the coordinate system.
|
|
*/
|
|
struct CESIUMGEOMETRY_API AxisAlignedBox final {
|
|
|
|
/**
|
|
* @brief Creates an empty AABB with a length, width, and height of zero,
|
|
* with the center located at (0, 0, 0).
|
|
*/
|
|
constexpr AxisAlignedBox() noexcept
|
|
: minimumX(0.0),
|
|
minimumY(0.0),
|
|
minimumZ(0.0),
|
|
maximumX(0.0),
|
|
maximumY(0.0),
|
|
maximumZ(0.0),
|
|
lengthX(0.0),
|
|
lengthY(0.0),
|
|
lengthZ(0.0),
|
|
center(0.0) {}
|
|
|
|
/**
|
|
* @brief Creates a new AABB using the range of coordinates the box covers.
|
|
*
|
|
* @param minimumX_ The minimum X coordinate within the box.
|
|
* @param minimumY_ The minimum Y coordinate within the box.
|
|
* @param minimumZ_ The minimum Z coordinate within the box.
|
|
* @param maximumX_ The maximum X coordinate within the box.
|
|
* @param maximumY_ The maximum Y coordinate within the box.
|
|
* @param maximumZ_ The maximum Z coordinate within the box.
|
|
*/
|
|
constexpr AxisAlignedBox(
|
|
double minimumX_,
|
|
double minimumY_,
|
|
double minimumZ_,
|
|
double maximumX_,
|
|
double maximumY_,
|
|
double maximumZ_) noexcept
|
|
: minimumX(minimumX_),
|
|
minimumY(minimumY_),
|
|
minimumZ(minimumZ_),
|
|
maximumX(maximumX_),
|
|
maximumY(maximumY_),
|
|
maximumZ(maximumZ_),
|
|
lengthX(maximumX - minimumX),
|
|
lengthY(maximumY - minimumY),
|
|
lengthZ(maximumZ - minimumZ),
|
|
center(
|
|
0.5 * (maximumX + minimumX),
|
|
0.5 * (maximumY + minimumY),
|
|
0.5 * (maximumZ + minimumZ)) {}
|
|
|
|
/**
|
|
* @brief The minimum x-coordinate.
|
|
*/
|
|
double minimumX;
|
|
|
|
/**
|
|
* @brief The minimum y-coordinate.
|
|
*/
|
|
double minimumY;
|
|
|
|
/**
|
|
* @brief The minimum z-coordinate.
|
|
*/
|
|
double minimumZ;
|
|
|
|
/**
|
|
* @brief The maximum x-coordinate.
|
|
*/
|
|
double maximumX;
|
|
|
|
/**
|
|
* @brief The maximum y-coordinate.
|
|
*/
|
|
double maximumY;
|
|
|
|
/**
|
|
* @brief The maximum z-coordinate.
|
|
*/
|
|
double maximumZ;
|
|
|
|
/**
|
|
* @brief The length of the box on the x-axis.
|
|
*/
|
|
double lengthX;
|
|
|
|
/**
|
|
* @brief The length of the box on the y-axis.
|
|
*/
|
|
double lengthY;
|
|
|
|
/**
|
|
* @brief The length of the box on the z-axis.
|
|
*/
|
|
double lengthZ;
|
|
|
|
/**
|
|
* @brief The center of the box.
|
|
*/
|
|
glm::dvec3 center;
|
|
|
|
/**
|
|
* @brief Checks if this AABB contains the given position.
|
|
*
|
|
* @param position The position to check.
|
|
* @returns True if this AABB contains the position, false otherwise.
|
|
*/
|
|
constexpr bool contains(const glm::dvec3& position) const noexcept {
|
|
return position.x >= this->minimumX && position.x <= this->maximumX &&
|
|
position.y >= this->minimumY && position.y <= this->maximumY &&
|
|
position.z >= this->minimumZ && position.z <= this->maximumZ;
|
|
}
|
|
};
|
|
|
|
} // namespace CesiumGeometry
|