#ifndef FURROVINEBOUNDINGRECTANGLE_H
#define FURROVINEBOUNDINGRECTANGLE_H
#include <Furrovine++/Vector2.h>
namespace Furrovine {
struct BoundingRectangle {
public:
Vector2 Min;
Vector2 Max;
BoundingRectangle () : Min(0), Max(1) {
}
BoundingRectangle (float X, float Y = 0, float width = 1, float height = 1) : Min(X, Y), Max(X + width, Y + height) {
}
BoundingRectangle (const Vector2& min, const Vector2& max) : Min(min), Max(max) {
}
BoundingRectangle (const Vector2& location, const Size2<float>& size) : Min(location.x, location.y), Max(location.x + size.Width, location.y + size.Height) {
}
BoundingRectangle (const BoundingRectangle& obj) : Min(obj.Min), Max(obj.Max) {
}
float Bottom () {
return Max.y;
}
float Right () {
return Max.x;
}
float CenterX () {
return Min.x + ((Max.x - Min.x) * 0.5f);
}
float CenterY () {
return Min.y + ((Max.y - Min.y) * 0.5f);
}
float Width () {
return Max.x - Min.x;
}
float Height () {
return Max.y - Min.y;
}
float Width () const {
return Max.x - Min.x;
}
float Height () const {
return Max.y - Min.y;
}
Vector2 Center () {
return Vector2(Min.x + ((Max.x - Min.x) * 0.5f), Min.y + ((Max.y - Min.y) * 0.5f));
}
Vector2 Location () {
return Min;
}
void Location (const float& X, const float& Y) {
float diffx = Min.x - X;
float diffy = Min.y - Y;
Min.x = X;
Min.y = Y;
Max.x += diffx;
Max.y += diffy;
}
void Location (const Vector2& p) {
float diffx = Min.x - p.x;
float diffy = Min.y - p.y;
Min.x = p.x;
Min.y = p.y;
Max.x += diffx;
Max.y += diffy;
}
void Size (const float& width, const float& height) {
Max.x = Min.x + Mathema<float>::Abs(width);
Max.y = Min.y + Mathema<float>::Abs(height);
}
Size2f Size () {
return Size2f(Width(), Height());
}
float WidthOverHeight () {
return Width() / Height();
}
float HeightOverWidth () {
return Height() / Width();
}
BoundingRectangle Shift (const float& X, const float& Y) {
BoundingRectangle rect(Min.x + X, Min.y + Y, Width(), Height());
return rect;
}
BoundingRectangle Scale (const float& xscale, const float& yscale) {
BoundingRectangle rect(Min.x, Min.y, Width() * xscale, Height() * yscale);
return rect;
}
bool Contains (const Vector2& p) {
return p.x > Min.x && p.y > Min.y && p.x < Max.x && p.y < Max.y;
}
bool Contains (const float& X, const float& Y) {
return X > Min.x && Y > Min.y && X < Max.x && Y < Max.y;
}
};
}
#endif // FURROVINEBOUNDINGRECTANGLE_H
I2lmbmRlZiBGVVJST1ZJTkVCT1VORElOR1JFQ1RBTkdMRV9ICiNkZWZpbmUgRlVSUk9WSU5FQk9VTkRJTkdSRUNUQU5HTEVfSAoKI2luY2x1ZGUgPEZ1cnJvdmluZSsrL1ZlY3RvcjIuaD4KCm5hbWVzcGFjZSBGdXJyb3ZpbmUgewogICAgCglzdHJ1Y3QgQm91bmRpbmdSZWN0YW5nbGUgewoJcHVibGljOgoJCVZlY3RvcjIgTWluOwoJCVZlY3RvcjIgTWF4OwoKCQlCb3VuZGluZ1JlY3RhbmdsZSAoKSA6IE1pbigwKSwgTWF4KDEpIHsKCQl9CgoJCUJvdW5kaW5nUmVjdGFuZ2xlIChmbG9hdCBYLCBmbG9hdCBZID0gMCwgZmxvYXQgd2lkdGggPSAxLCBmbG9hdCBoZWlnaHQgPSAxKSA6IE1pbihYLCBZKSwgTWF4KFggKyB3aWR0aCwgWSArIGhlaWdodCkgewoJCX0KCgkJQm91bmRpbmdSZWN0YW5nbGUgKGNvbnN0IFZlY3RvcjImIG1pbiwgY29uc3QgVmVjdG9yMiYgbWF4KSA6IE1pbihtaW4pLCBNYXgobWF4KSB7CgkJfQoKCQlCb3VuZGluZ1JlY3RhbmdsZSAoY29uc3QgVmVjdG9yMiYgbG9jYXRpb24sIGNvbnN0IFNpemUyPGZsb2F0PiYgc2l6ZSkgOiBNaW4obG9jYXRpb24ueCwgbG9jYXRpb24ueSksIE1heChsb2NhdGlvbi54ICsgc2l6ZS5XaWR0aCwgbG9jYXRpb24ueSArIHNpemUuSGVpZ2h0KSB7CgkJfQoKCQlCb3VuZGluZ1JlY3RhbmdsZSAoY29uc3QgQm91bmRpbmdSZWN0YW5nbGUmIG9iaikgOiBNaW4ob2JqLk1pbiksIE1heChvYmouTWF4KSB7CgkJfQoKCQlmbG9hdCBCb3R0b20gKCkgewoJCQlyZXR1cm4gTWF4Lnk7CgkJfQoKCQlmbG9hdCBSaWdodCAoKSB7CgkJCXJldHVybiBNYXgueDsKCQl9CgoJCWZsb2F0IENlbnRlclggKCkgewoJCQlyZXR1cm4gTWluLnggKyAoKE1heC54IC0gTWluLngpICogMC41Zik7CgkJfQoKCQlmbG9hdCBDZW50ZXJZICgpIHsKCQkJcmV0dXJuIE1pbi55ICsgKChNYXgueSAtIE1pbi55KSAqIDAuNWYpOwoJCX0KCgkJZmxvYXQgV2lkdGggKCkgewoJCQlyZXR1cm4gTWF4LnggLSBNaW4ueDsKCQl9CgoJCWZsb2F0IEhlaWdodCAoKSB7CgkJCXJldHVybiBNYXgueSAtIE1pbi55OwoJCX0KCgkJZmxvYXQgV2lkdGggKCkgY29uc3QgewoJCQlyZXR1cm4gTWF4LnggLSBNaW4ueDsKCQl9CgoJCWZsb2F0IEhlaWdodCAoKSBjb25zdCB7CgkJCXJldHVybiBNYXgueSAtIE1pbi55OwoJCX0KCgkJVmVjdG9yMiBDZW50ZXIgKCkgewoJCQlyZXR1cm4gVmVjdG9yMihNaW4ueCArICgoTWF4LnggLSBNaW4ueCkgKiAwLjVmKSwgTWluLnkgKyAoKE1heC55IC0gTWluLnkpICogMC41ZikpOwoJCX0KCgkJVmVjdG9yMiBMb2NhdGlvbiAoKSB7CgkJCXJldHVybiBNaW47CgkJfQoKCQl2b2lkIExvY2F0aW9uIChjb25zdCBmbG9hdCYgWCwgY29uc3QgZmxvYXQmIFkpIHsKCQkJZmxvYXQgZGlmZnggPSBNaW4ueCAtIFg7CgkJCWZsb2F0IGRpZmZ5ID0gTWluLnkgLSBZOwoJCQlNaW4ueCA9IFg7CgkJCU1pbi55ID0gWTsKCQkJTWF4LnggKz0gZGlmZng7CgkJCU1heC55ICs9IGRpZmZ5OwoJCX0KCgkJdm9pZCBMb2NhdGlvbiAoY29uc3QgVmVjdG9yMiYgcCkgewoJCQlmbG9hdCBkaWZmeCA9IE1pbi54IC0gcC54OwoJCQlmbG9hdCBkaWZmeSA9IE1pbi55IC0gcC55OwoJCQlNaW4ueCA9IHAueDsKCQkJTWluLnkgPSBwLnk7CgkJCU1heC54ICs9IGRpZmZ4OwoJCQlNYXgueSArPSBkaWZmeTsKCQl9CgoJCXZvaWQgU2l6ZSAoY29uc3QgZmxvYXQmIHdpZHRoLCBjb25zdCBmbG9hdCYgaGVpZ2h0KSB7CgkJCU1heC54ID0gTWluLnggKyBNYXRoZW1hPGZsb2F0Pjo6QWJzKHdpZHRoKTsKCQkJTWF4LnkgPSBNaW4ueSArIE1hdGhlbWE8ZmxvYXQ+OjpBYnMoaGVpZ2h0KTsKCQl9CgoJCVNpemUyZiBTaXplICgpIHsKCQkJcmV0dXJuIFNpemUyZihXaWR0aCgpLCBIZWlnaHQoKSk7CgkJfQoKCQlmbG9hdCBXaWR0aE92ZXJIZWlnaHQgKCkgewoJCQlyZXR1cm4gV2lkdGgoKSAvIEhlaWdodCgpOwoJCX0KCgkJZmxvYXQgSGVpZ2h0T3ZlcldpZHRoICgpIHsKCQkJcmV0dXJuIEhlaWdodCgpIC8gV2lkdGgoKTsKCQl9CgoJCUJvdW5kaW5nUmVjdGFuZ2xlIFNoaWZ0IChjb25zdCBmbG9hdCYgWCwgY29uc3QgZmxvYXQmIFkpIHsKCQkJQm91bmRpbmdSZWN0YW5nbGUgcmVjdChNaW4ueCArIFgsIE1pbi55ICsgWSwgV2lkdGgoKSwgSGVpZ2h0KCkpOwoJCQlyZXR1cm4gcmVjdDsKCQl9CgoJCUJvdW5kaW5nUmVjdGFuZ2xlIFNjYWxlIChjb25zdCBmbG9hdCYgeHNjYWxlLCBjb25zdCBmbG9hdCYgeXNjYWxlKSB7CgkJCUJvdW5kaW5nUmVjdGFuZ2xlIHJlY3QoTWluLngsIE1pbi55LCBXaWR0aCgpICogeHNjYWxlLCBIZWlnaHQoKSAqIHlzY2FsZSk7CgkJCXJldHVybiByZWN0OwoJCX0KCgkJYm9vbCBDb250YWlucyAoY29uc3QgVmVjdG9yMiYgcCkgewoJCQlyZXR1cm4gcC54ID4gTWluLnggJiYgcC55ID4gTWluLnkgJiYgcC54IDwgTWF4LnggJiYgcC55IDwgTWF4Lnk7IAoJCX0KCgkJYm9vbCBDb250YWlucyAoY29uc3QgZmxvYXQmIFgsIGNvbnN0IGZsb2F0JiBZKSB7CgkJCXJldHVybiBYID4gTWluLnggJiYgWSA+IE1pbi55ICYmIFggPCBNYXgueCAmJiBZIDwgTWF4Lnk7CgkJfQoJfTsKfQojZW5kaWYgLy8gRlVSUk9WSU5FQk9VTkRJTkdSRUNUQU5HTEVfSCAK