From a9506246690ed056d025648ccd4f3516cf3b53a1 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Sat, 27 Jul 2024 09:38:55 -0700 Subject: [PATCH] math: add Edges (#10) --- include/hyprutils/math/Box.hpp | 8 ++- include/hyprutils/math/Edges.hpp | 110 +++++++++++++++++++++++++++++++ src/math/Box.cpp | 4 ++ 3 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 include/hyprutils/math/Edges.hpp diff --git a/include/hyprutils/math/Box.hpp b/include/hyprutils/math/Box.hpp index db10428..b59c312 100644 --- a/include/hyprutils/math/Box.hpp +++ b/include/hyprutils/math/Box.hpp @@ -135,6 +135,12 @@ namespace Hyprutils::Math { */ Vector2D size() const; + /** + * @brief Retrieves the size of the box offset by its position. + * @return Vector2D representing the bottom right extent of the box. + */ + Vector2D extent() const; + /** * @brief Finds the closest point within the box to a given vector. * @param vec Vector from which to find the closest point. @@ -179,4 +185,4 @@ namespace Hyprutils::Math { private: CBox roundInternal(); }; -} \ No newline at end of file +} diff --git a/include/hyprutils/math/Edges.hpp b/include/hyprutils/math/Edges.hpp new file mode 100644 index 0000000..a1eaef9 --- /dev/null +++ b/include/hyprutils/math/Edges.hpp @@ -0,0 +1,110 @@ +#pragma once +#include + +namespace Hyprutils::Math { + + /** + * @brief Flag set of box edges + */ + class CEdges { + public: + enum eEdges : uint8_t { + NONE = 0, + TOP = 1, + LEFT = 2, + BOTTOM = 4, + RIGHT = 8, + }; + + CEdges() = default; + CEdges(eEdges edges) : m_edges(edges) {} + CEdges(uint8_t edges) : m_edges(static_cast(edges)) {} + + bool operator==(const CEdges& other) { + return m_edges == other.m_edges; + } + + CEdges operator|(const CEdges& other) { + return m_edges | other.m_edges; + } + + CEdges operator&(const CEdges& other) { + return m_edges & other.m_edges; + } + + CEdges operator^(const CEdges& other) { + return m_edges ^ other.m_edges; + } + + void operator|=(const CEdges& other) { + m_edges = (*this | other).m_edges; + } + + void operator&=(const CEdges& other) { + m_edges = (*this & other).m_edges; + } + + void operator^=(const CEdges& other) { + m_edges = (*this ^ other).m_edges; + } + + /** + * @return if the edge set contains the top edge. + */ + bool top() { + return m_edges & TOP; + } + + /** + * @return if the edge set contains the left edge. + */ + bool left() { + return m_edges & LEFT; + } + + /** + * @return if the edge set contains the bottom edge. + */ + bool bottom() { + return m_edges & BOTTOM; + } + + /** + * @return if the edge set contains the right edge. + */ + bool right() { + return m_edges & RIGHT; + } + + /** + * @param top The state the top edge should be set to. + */ + void setTop(bool top) { + m_edges = static_cast((m_edges & ~TOP) | (TOP * top)); + } + + /** + * @param left The state the left edge should be set to. + */ + void setLeft(bool left) { + m_edges = static_cast((m_edges & ~LEFT) | (LEFT * left)); + } + + /** + * @param bottom The state the bottom edge should be set to. + */ + void setBottom(bool bottom) { + m_edges = static_cast((m_edges & ~BOTTOM) | (BOTTOM * bottom)); + } + + /** + * @param right The state the right edge should be set to. + */ + void setRight(bool right) { + m_edges = static_cast((m_edges & ~RIGHT) | (RIGHT * right)); + } + + eEdges m_edges = NONE; + }; + +} diff --git a/src/math/Box.cpp b/src/math/Box.cpp index e587f75..fcd1eda 100644 --- a/src/math/Box.cpp +++ b/src/math/Box.cpp @@ -199,6 +199,10 @@ Vector2D Hyprutils::Math::CBox::size() const { return {w, h}; } +Vector2D Hyprutils::Math::CBox::extent() const { + return pos() + size(); +} + Vector2D Hyprutils::Math::CBox::closestPoint(const Vector2D& vec) const { if (containsPoint(vec)) return vec;