blooblib/blooblib/include/rect.h

57 lines
1.3 KiB
C++

#pragma once
#include "vec2.h"
template <typename T>
struct rect {
vec2<T> pos, size;
rect() : pos(vec2<T>::zero), size(vec2<T>::zero) {};
rect(vec2<T> pos, vec2<T> size) : pos(pos), size(size) {};
rect<T> normal() const; //flip direction so size is positive
vec2<T> pos2() const;
bool operator==(rect<T> const& other) const;
static rect<T> from_points(vec2<T> pos1, vec2<T> pos2);
static rect<T> intersection(rect<T> const& a, rect<T> const& b);
};
template<typename T>
inline rect<T> rect<T>::normal() const {
auto r = *this;
if(r.size.x < 0) {
r.pos.x += r.size.x;
r.size.x *= -1;
}
if(r.size.y < 0) {
r.pos.y += r.size.y;
r.size.y *= -1;
}
return r;
}
template<typename T>
inline vec2<T> rect<T>::pos2() const {
return pos + size - vec2<T>::one;
}
template<typename T>
inline bool rect<T>::operator==(rect<T> const& other) const {
return pos == other.pos && size == other.size;
}
template<typename T>
inline rect<T> rect<T>::from_points(vec2<T> pos1, vec2<T> pos2) {
return rect<T>(pos1, pos2-pos1+vec2<T>::one).normal();
}
template<typename T>
inline rect<T> rect<T>::intersection(rect<T> const& a, rect<T> const& b) {
return rect<T>::from_points(vec2<T>::max(a.pos, b.pos), vec2<T>::min(a.pos2(), b.pos2()));
}
using recti = rect<int32_t>;
using rectf = rect<float>;