TileMap Fix trying to get data for tile not existing in attached TileSet

(cherry picked from commit 2eeed26d67)
This commit is contained in:
kleonc 2021-08-06 18:51:21 +02:00 committed by Rémi Verschelde
parent eaf45d4f60
commit 5acfb5127c
No known key found for this signature in database
GPG key ID: C3336907360768E1
2 changed files with 14 additions and 9 deletions

View file

@ -370,7 +370,7 @@ void TileMapEditor::_set_cell(const Point2i &p_pos, Vector<int> p_values, bool p
if (tool == TOOL_PASTING)
return;
if (manual_autotile || (p_value != -1 && node->get_tileset()->tile_get_tile_mode(p_value) == TileSet::ATLAS_TILE)) {
if (manual_autotile || (p_value != -1 && node->get_tileset()->has_tile(p_value) && node->get_tileset()->tile_get_tile_mode(p_value) == TileSet::ATLAS_TILE)) {
if (current != -1) {
node->set_cell_autotile_coord(p_pos.x, p_pos.y, position);
} else if (node->get_tileset()->tile_get_tile_mode(p_value) == TileSet::ATLAS_TILE && priority_atlastile) {
@ -561,8 +561,7 @@ void TileMapEditor::_update_palette() {
sel_tile = palette->get_selected_items().get(0);
}
if (sel_tile != TileMap::INVALID_CELL && ((manual_autotile && tileset->tile_get_tile_mode(sel_tile) == TileSet::AUTO_TILE) || (!priority_atlastile && tileset->tile_get_tile_mode(sel_tile) == TileSet::ATLAS_TILE))) {
if (sel_tile != TileMap::INVALID_CELL && tileset->has_tile(sel_tile) && ((manual_autotile && tileset->tile_get_tile_mode(sel_tile) == TileSet::AUTO_TILE) || (!priority_atlastile && tileset->tile_get_tile_mode(sel_tile) == TileSet::ATLAS_TILE))) {
const Map<Vector2, uint32_t> &tiles2 = tileset->autotile_get_bitmask_map(sel_tile);
Vector<Vector2> entries2;
@ -611,7 +610,7 @@ void TileMapEditor::_update_palette() {
manual_palette->show();
}
if (sel_tile != TileMap::INVALID_CELL && tileset->tile_get_tile_mode(sel_tile) == TileSet::AUTO_TILE) {
if (sel_tile != TileMap::INVALID_CELL && tileset->has_tile(sel_tile) && tileset->tile_get_tile_mode(sel_tile) == TileSet::AUTO_TILE) {
manual_button->show();
priority_button->hide();
} else {
@ -624,8 +623,9 @@ void TileMapEditor::_pick_tile(const Point2 &p_pos) {
int id = node->get_cell(p_pos.x, p_pos.y);
if (id == TileMap::INVALID_CELL)
if (id == TileMap::INVALID_CELL || !node->get_tileset()->has_tile(id)) {
return;
}
if (search_box->get_text() != "") {
search_box->set_text("");
@ -821,11 +821,14 @@ void TileMapEditor::_erase_selection() {
}
void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i &p_autotile_coord, const Transform2D &p_xform) {
if (!node->get_tileset()->has_tile(p_cell)) {
return;
}
Ref<Texture> t = node->get_tileset()->tile_get_texture(p_cell);
if (t.is_null())
if (t.is_null()) {
return;
}
Vector2 tile_ofs = node->get_tileset()->tile_get_texture_offset(p_cell);

View file

@ -418,8 +418,7 @@ void TileMap::update_dirty_quadrants() {
Ref<ShaderMaterial> mat = tile_set->tile_get_material(c.id);
int z_index = tile_set->tile_get_z_index(c.id);
if (tile_set->tile_get_tile_mode(c.id) == TileSet::AUTO_TILE ||
tile_set->tile_get_tile_mode(c.id) == TileSet::ATLAS_TILE) {
if (tile_set->tile_get_tile_mode(c.id) == TileSet::AUTO_TILE || tile_set->tile_get_tile_mode(c.id) == TileSet::ATLAS_TILE) {
z_index += tile_set->autotile_get_z_index(c.id, Vector2(c.autotile_coord_x, c.autotile_coord_y));
}
@ -965,6 +964,9 @@ void TileMap::update_cell_bitmask(int p_x, int p_y) {
Map<PosKey, Cell>::Element *E = tile_map.find(p);
if (E != NULL) {
int id = get_cell(p_x, p_y);
if (!tile_set->has_tile(id)) {
return;
}
if (tile_set->tile_get_tile_mode(id) == TileSet::AUTO_TILE) {
uint16_t mask = 0;
if (tile_set->autotile_get_bitmask_mode(id) == TileSet::BITMASK_2X2) {