#pragma once #include "CTRPluginFramework/Vector.hpp" #include namespace CTRPluginFramework { template class Rect { public: Rect(); Rect(const Vector& leftTop, const Vector& size); Rect(const Vector& leftTop, T width, T height); Rect(T left, T top, const Vector& size); Rect(T left, T top, T width, T height); template explicit Rect(const Rect& rect); bool Contains(T x, T y) const; bool Contains(const Vector& point) const; bool Intersects(const Rect& rect) const; bool Intersects(const Rect& rect, Rect& intersect) const; Vector leftTop; Vector size; }; template Rect::Rect() : leftTop(0, 0), size(0, 0) { } template Rect::Rect(const Vector& leftTopCorner, const Vector& size) { leftTop = leftTopCorner; this->size = size; } template Rect::Rect(const Vector& leftTopCorner, T width, T height) { leftTop = leftTopCorner; size.x = width; size.y = height; } template Rect::Rect(T left, T top, const Vector& size) { leftTop.x = left; leftTop.y = top; this->size = size; } template Rect::Rect(T left, T top, T width, T height) { leftTop.x = left; leftTop.y = top; size.x = width; size.y = height; } template template Rect::Rect(const Rect& rect) { leftTop = reinterpret_cast(rect.leftTop); size = reinterpret_cast(rect.size); } template bool Rect::Contains(T x, T y) const { T minX = std::min(leftTop.x, leftTop.x + size.x); T maxX = std::max(leftTop.x, leftTop.x + size.x); T minY = std::min(leftTop.y, leftTop.y + size.y); T maxY = std::max(leftTop.y, leftTop.y + size.y); return (x >= minX && x < maxX && y >= minY && y < maxY); } template bool Rect::Contains(const Vector& point) const { return (Contains(point.x, point.y)); } template bool Rect::Intersects(const Rect& rect) const { Rect intersect; return (Intersects(rect, intersect)); } template bool Rect::Intersects(const Rect &rect, Rect &intersect) const { T thisMinX = std::min(leftTop.x, leftTop.x + size.x); T thisMaxX = std::max(leftTop.x, leftTop.x + size.x); T thisMinY = std::min(leftTop.y, leftTop.y + size.y); T thisMaxY = std::max(leftTop.y, leftTop.y + size.y); T rectMinX = std::min(rect.leftTop.x, rect.leftTop.x + rect.size.x); T rectMaxX = std::max(rect.leftTop.x, rect.leftTop.x + rect.size.x); T rectMinY = std::min(rect.leftTop.y, rect.leftTop.y + rect.size.y); T rectMaxY = std::max(rect.leftTop.y, rect.leftTop.y + rect.size.y); T intersectLeftX = std::max(thisMinX, rectMinX); T intersectLeftY = std::max(thisMinY, rectMinY); T intersectRightX = std::min(thisMaxX, rectMaxX); T intersectRightY = std::min(thisMaxY, rectMaxY); if (intersectLeftX < intersectRightX && intersectLeftY < intersectRightY) { intersect = Rect(intersectLeftX, intersectLeftY, intersectRightX - intersectLeftX, intersectRightY - intersectLeftY); return (true); } intersect = Rect(0, 0, 0, 0); return (false); } template bool operator ==(Rect &left, Rect &right) { return (left.leftTop == right.leftTop && left.size == right.size); } template bool operator !=(Rect &left, Rect &right) { return (left.leftTop != right.leftTop && left.size != right.size); } typedef Rect UIntRect; typedef Rect IntRect; typedef Rect FloatRect; }