| #ifndef _RIVE_AABB_HPP_ |
| #define _RIVE_AABB_HPP_ |
| |
| #include "rive/math/mat2d.hpp" |
| #include "rive/math/vec2d.hpp" |
| #include <cstddef> |
| |
| namespace rive { |
| struct IAABB { |
| int32_t left, top, right, bottom; |
| |
| constexpr int width() const { return right - left; } |
| constexpr int height() const { return bottom - top; } |
| constexpr bool empty() const { return width() <= 0 || height() <= 0; } |
| |
| IAABB inset(int dx, int dy) const { |
| return {left + dx, top + dy, right - dx, bottom - dy}; |
| } |
| IAABB offset(int dx, int dy) const { |
| return {left + dx, top + dy, right + dx, bottom + dy}; |
| } |
| }; |
| |
| class AABB { |
| public: |
| union { |
| float buffer[4]; |
| struct { |
| float minX, minY, maxX, maxY; |
| }; |
| }; |
| |
| public: |
| AABB() : buffer{0} {} |
| AABB(const AABB& o) : |
| minX(o.minX), minY(o.minY), maxX(o.maxX), maxY(o.maxY) |
| {} |
| |
| AABB(float minX, float minY, float maxX, float maxY) : |
| minX(minX), minY(minY), maxX(maxX), maxY(maxY) |
| {} |
| |
| AABB(const IAABB& o) : |
| AABB((float)o.left, (float)o.top, (float)o.right, (float)o.bottom) |
| {} |
| |
| bool operator==(const AABB& o) const { |
| return minX == o.minX && minY == o.minY && |
| maxX == o.maxX && maxY == o.maxY; |
| } |
| bool operator!=(const AABB& o) const { |
| return !(*this == o); |
| } |
| |
| inline const float* values() const { return buffer; } |
| |
| float& operator[](std::size_t idx) { return buffer[idx]; } |
| const float& operator[](std::size_t idx) const { return buffer[idx]; } |
| |
| static bool contains(const AABB& a, const AABB& b); |
| static bool isValid(const AABB& a); |
| static bool testOverlap(const AABB& a, const AABB& b); |
| static bool areIdentical(const AABB& a, const AABB& b); |
| static void transform(AABB& out, const AABB& a, const Mat2D& matrix); |
| |
| float left() const { return minX; } |
| float top() const { return minY; } |
| float right() const { return maxX; } |
| float bottom() const { return maxY; } |
| |
| float width() const { return maxX - minX; } |
| float height() const { return maxY - minY; } |
| Vec2D size() const { |
| return {width(), height()}; |
| } |
| Vec2D center() const { |
| return {(minX + maxX) * 0.5f, (minY + maxY) * 0.5f}; |
| } |
| |
| AABB inset(float dx, float dy) const { |
| AABB r = {minX + dx, minY + dy, maxX - dx, maxY - dy}; |
| assert(r.width() >= 0); |
| assert(r.height() >= 0); |
| return r; |
| } |
| AABB offset(float dx, float dy) const { |
| return {minX + dx, minY + dy, maxX + dx, maxY + dy}; |
| } |
| |
| IAABB round() const; |
| }; |
| |
| } // namespace rive |
| #endif |