Fix some issue with TileMap's and other nodes' boundaries
Fixes #30348
Addresses a small part of #30012
(cherry picked from commit ebf2a4d553
)
This commit is contained in:
parent
0f0016bb75
commit
e17a57d88a
|
@ -58,7 +58,7 @@ Rect2 Path2D::_edit_get_rect() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Path2D::_edit_use_rect() const {
|
bool Path2D::_edit_use_rect() const {
|
||||||
return true;
|
return curve.is_valid() && curve->get_point_count() != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Path2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const {
|
bool Path2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const {
|
||||||
|
|
|
@ -76,7 +76,7 @@ Rect2 Polygon2D::_edit_get_rect() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Polygon2D::_edit_use_rect() const {
|
bool Polygon2D::_edit_use_rect() const {
|
||||||
return true;
|
return polygon.size() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Polygon2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const {
|
bool Polygon2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const {
|
||||||
|
|
|
@ -760,7 +760,7 @@ void TileMap::set_cell(int p_x, int p_y, int p_tile, bool p_flip_x, bool p_flip_
|
||||||
if (!E && p_tile == INVALID_CELL)
|
if (!E && p_tile == INVALID_CELL)
|
||||||
return; //nothing to do
|
return; //nothing to do
|
||||||
|
|
||||||
PosKey qk(p_x / _get_quadrant_size(), p_y / _get_quadrant_size());
|
PosKey qk = pk.to_quadrant(_get_quadrant_size());
|
||||||
if (p_tile == INVALID_CELL) {
|
if (p_tile == INVALID_CELL) {
|
||||||
//erase existing
|
//erase existing
|
||||||
tile_map.erase(pk);
|
tile_map.erase(pk);
|
||||||
|
@ -919,7 +919,7 @@ void TileMap::update_cell_bitmask(int p_x, int p_y) {
|
||||||
E->get().autotile_coord_x = (int)coord.x;
|
E->get().autotile_coord_x = (int)coord.x;
|
||||||
E->get().autotile_coord_y = (int)coord.y;
|
E->get().autotile_coord_y = (int)coord.y;
|
||||||
|
|
||||||
PosKey qk(p_x / _get_quadrant_size(), p_y / _get_quadrant_size());
|
PosKey qk = p.to_quadrant(_get_quadrant_size());
|
||||||
Map<PosKey, Quadrant>::Element *Q = quadrant_map.find(qk);
|
Map<PosKey, Quadrant>::Element *Q = quadrant_map.find(qk);
|
||||||
_make_quadrant_dirty(Q);
|
_make_quadrant_dirty(Q);
|
||||||
|
|
||||||
|
@ -1007,7 +1007,7 @@ void TileMap::set_cell_autotile_coord(int p_x, int p_y, const Vector2 &p_coord)
|
||||||
c.autotile_coord_y = p_coord.y;
|
c.autotile_coord_y = p_coord.y;
|
||||||
tile_map[pk] = c;
|
tile_map[pk] = c;
|
||||||
|
|
||||||
PosKey qk(p_x / _get_quadrant_size(), p_y / _get_quadrant_size());
|
PosKey qk = pk.to_quadrant(_get_quadrant_size());
|
||||||
Map<PosKey, Quadrant>::Element *Q = quadrant_map.find(qk);
|
Map<PosKey, Quadrant>::Element *Q = quadrant_map.find(qk);
|
||||||
|
|
||||||
if (!Q)
|
if (!Q)
|
||||||
|
@ -1034,7 +1034,7 @@ void TileMap::_recreate_quadrants() {
|
||||||
|
|
||||||
for (Map<PosKey, Cell>::Element *E = tile_map.front(); E; E = E->next()) {
|
for (Map<PosKey, Cell>::Element *E = tile_map.front(); E; E = E->next()) {
|
||||||
|
|
||||||
PosKey qk(E->key().x / _get_quadrant_size(), E->key().y / _get_quadrant_size());
|
PosKey qk = PosKey(E->key().x, E->key().y).to_quadrant(_get_quadrant_size());
|
||||||
|
|
||||||
Map<PosKey, Quadrant>::Element *Q = quadrant_map.find(qk);
|
Map<PosKey, Quadrant>::Element *Q = quadrant_map.find(qk);
|
||||||
if (!Q) {
|
if (!Q) {
|
||||||
|
@ -1174,7 +1174,11 @@ PoolVector<int> TileMap::_get_tile_data() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Rect2 TileMap::_edit_get_rect() const {
|
Rect2 TileMap::_edit_get_rect() const {
|
||||||
|
if (pending_update) {
|
||||||
const_cast<TileMap *>(this)->update_dirty_quadrants();
|
const_cast<TileMap *>(this)->update_dirty_quadrants();
|
||||||
|
} else {
|
||||||
|
const_cast<TileMap *>(this)->_recompute_rect_cache();
|
||||||
|
}
|
||||||
return rect_cache;
|
return rect_cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,13 @@ private:
|
||||||
|
|
||||||
bool operator==(const PosKey &p_k) const { return (y == p_k.y && x == p_k.x); }
|
bool operator==(const PosKey &p_k) const { return (y == p_k.y && x == p_k.x); }
|
||||||
|
|
||||||
|
PosKey to_quadrant(const int &p_quadrant_size) const {
|
||||||
|
// rounding down, instead of simply rounding towards zero (truncating)
|
||||||
|
return PosKey(
|
||||||
|
x > 0 ? x / p_quadrant_size : (x - (p_quadrant_size - 1)) / p_quadrant_size,
|
||||||
|
y > 0 ? y / p_quadrant_size : (y - (p_quadrant_size - 1)) / p_quadrant_size);
|
||||||
|
}
|
||||||
|
|
||||||
PosKey(int16_t p_x, int16_t p_y) {
|
PosKey(int16_t p_x, int16_t p_y) {
|
||||||
x = p_x;
|
x = p_x;
|
||||||
y = p_y;
|
y = p_y;
|
||||||
|
|
Loading…
Reference in New Issue