2022-02-04 11:56:43 +01:00
|
|
|
#ifndef RECT2I_H
|
|
|
|
#define RECT2I_H
|
|
|
|
|
|
|
|
#include "vector2i.h"
|
2022-02-04 13:13:27 +01:00
|
|
|
#include "vector2.h"
|
2022-02-04 13:06:13 +01:00
|
|
|
#include "math.h"
|
2022-02-04 11:56:43 +01:00
|
|
|
|
2022-02-04 13:13:27 +01:00
|
|
|
class Rect2;
|
|
|
|
|
2022-02-04 11:56:43 +01:00
|
|
|
class Rect2i {
|
|
|
|
public:
|
|
|
|
float get_area() const;
|
|
|
|
bool intersects(const Rect2i &b) const;
|
|
|
|
bool intersects_include_borders(const Rect2i &b) const;
|
|
|
|
bool encloses(const Rect2i &b) const;
|
|
|
|
bool has_no_area() const;
|
|
|
|
bool has_point(const int px, const int py) const;
|
|
|
|
bool is_equal_approx(const Rect2i &b) const;
|
|
|
|
|
|
|
|
void grow(const int by);
|
|
|
|
void shrink(const int by);
|
|
|
|
|
|
|
|
void expand_to(const Vector2i &p_vector);
|
2022-02-04 13:06:13 +01:00
|
|
|
inline Rect2i clip(const Rect2i &p_rect) const;
|
2022-02-04 11:56:43 +01:00
|
|
|
|
2022-02-04 13:21:15 +01:00
|
|
|
inline Rect2i abs() const;
|
|
|
|
|
2022-02-04 12:54:28 +01:00
|
|
|
Vector2i position() const;
|
|
|
|
Vector2i size() const;
|
|
|
|
|
2022-02-04 11:56:43 +01:00
|
|
|
Rect2i &operator+=(const Rect2i &b);
|
|
|
|
Rect2i &operator-=(const Rect2i &b);
|
|
|
|
|
|
|
|
friend Rect2i operator+(Rect2i lhs, const Rect2i &rhs);
|
|
|
|
friend Rect2i operator-(Rect2i lhs, const Rect2i &rhs);
|
|
|
|
|
|
|
|
friend bool operator==(const Rect2i &a, const Rect2i &b);
|
|
|
|
friend bool operator!=(const Rect2i &a, const Rect2i &b);
|
|
|
|
|
2022-02-04 13:13:27 +01:00
|
|
|
operator Rect2() const;
|
|
|
|
|
2022-02-04 11:56:43 +01:00
|
|
|
Rect2i();
|
|
|
|
Rect2i(const Rect2i &b);
|
|
|
|
Rect2i(const int rx, const int ry);
|
|
|
|
Rect2i(const int rx, const int ry, const int rw, const int rh);
|
|
|
|
Rect2i(const Vector2i &position, const Vector2i &size);
|
2022-02-04 13:13:27 +01:00
|
|
|
Rect2i(const Vector2 &position, const Vector2 &size);
|
|
|
|
Rect2i(const Vector2i &position, const Vector2 &size);
|
|
|
|
Rect2i(const Vector2 &position, const Vector2i &size);
|
2022-02-04 11:56:43 +01:00
|
|
|
|
|
|
|
int x;
|
|
|
|
int y;
|
|
|
|
int w;
|
|
|
|
int h;
|
|
|
|
};
|
|
|
|
|
2022-02-04 13:06:13 +01:00
|
|
|
// Taken from the Godot Engine (MIT License)
|
|
|
|
// Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.
|
|
|
|
// Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).
|
|
|
|
inline Rect2i Rect2i::clip(const Rect2i &p_rect) const { /// return a clipped rect
|
|
|
|
Rect2i new_rect = p_rect;
|
|
|
|
|
|
|
|
if (!intersects(new_rect)) {
|
|
|
|
return Rect2i();
|
|
|
|
}
|
|
|
|
|
|
|
|
new_rect.x = MAX(p_rect.x, x);
|
|
|
|
new_rect.y = MAX(p_rect.y, y);
|
|
|
|
|
|
|
|
Vector2i p_rect_end = p_rect.position() + p_rect.size();
|
|
|
|
Vector2i end = position() + size();
|
|
|
|
|
|
|
|
new_rect.w = MIN(p_rect_end.x, end.x) - new_rect.x;
|
|
|
|
new_rect.h = MIN(p_rect_end.y, end.y) - new_rect.y;
|
|
|
|
|
|
|
|
return new_rect;
|
|
|
|
}
|
|
|
|
|
2022-02-04 13:21:15 +01:00
|
|
|
Rect2i Rect2i::abs() const {
|
|
|
|
return Rect2i(x + MIN(w, 0), y + MIN(h, 0), ABS(w), ABS(h));
|
|
|
|
}
|
|
|
|
|
2022-02-04 11:56:43 +01:00
|
|
|
#endif
|