Merge pull request #30425 from bojidar-bg/30348-30012-node-boundaries

Fix some issues with TileMap's and other nodes' boundaries
This commit is contained in:
Rémi Verschelde 2019-07-08 13:37:41 +02:00 committed by GitHub
commit f400227145
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 18 additions and 7 deletions

View File

@ -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 {

View File

@ -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 {

View File

@ -861,7 +861,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);
@ -1020,7 +1020,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);
@ -1117,7 +1117,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)
@ -1144,7 +1144,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) {
@ -1281,7 +1281,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;
} }

View File

@ -94,6 +94,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;