You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
Implement atlas merging and tile proxies
This commit is contained in:
@@ -56,18 +56,11 @@ void TileMapEditorTilesPlugin::_notification(int p_what) {
|
||||
picker_button->set_icon(get_theme_icon(SNAME("ColorPick"), SNAME("EditorIcons")));
|
||||
erase_button->set_icon(get_theme_icon(SNAME("Eraser"), SNAME("EditorIcons")));
|
||||
|
||||
toggle_grid_button->set_icon(get_theme_icon(SNAME("Grid"), SNAME("EditorIcons")));
|
||||
|
||||
missing_atlas_texture_icon = get_theme_icon(SNAME("TileSet"), SNAME("EditorIcons"));
|
||||
|
||||
toggle_grid_button->set_pressed(EditorSettings::get_singleton()->get("editors/tiles_editor/display_grid"));
|
||||
break;
|
||||
case NOTIFICATION_VISIBILITY_CHANGED:
|
||||
_stop_dragging();
|
||||
break;
|
||||
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED:
|
||||
toggle_grid_button->set_pressed(EditorSettings::get_singleton()->get("editors/tiles_editor/display_grid"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,10 +78,6 @@ void TileMapEditorTilesPlugin::_on_scattering_spinbox_changed(double p_value) {
|
||||
scattering = p_value;
|
||||
}
|
||||
|
||||
void TileMapEditorTilesPlugin::_on_grid_toggled(bool p_pressed) {
|
||||
EditorSettings::get_singleton()->set("editors/tiles_editor/display_grid", p_pressed);
|
||||
}
|
||||
|
||||
void TileMapEditorTilesPlugin::_update_toolbar() {
|
||||
// Stop draggig if needed.
|
||||
_stop_dragging();
|
||||
@@ -204,7 +193,7 @@ void TileMapEditorTilesPlugin::_update_tile_set_sources_list() {
|
||||
}
|
||||
|
||||
// Synchronize
|
||||
TilesEditor::get_singleton()->set_atlas_sources_lists_current(sources_list->get_current());
|
||||
TilesEditor::get_singleton()->set_sources_lists_current(sources_list->get_current());
|
||||
}
|
||||
|
||||
void TileMapEditorTilesPlugin::_update_bottom_panel() {
|
||||
@@ -410,7 +399,7 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
|
||||
if (!tile_map_selection.is_empty()) {
|
||||
undo_redo->create_action(TTR("Delete tiles"));
|
||||
for (Set<Vector2i>::Element *E = tile_map_selection.front(); E; E = E->next()) {
|
||||
undo_redo->add_do_method(tile_map, "set_cell", E->get(), -1, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
|
||||
undo_redo->add_do_method(tile_map, "set_cell", E->get(), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
|
||||
undo_redo->add_undo_method(tile_map, "set_cell", E->get(), tile_map->get_cell_source_id(E->get()), tile_map->get_cell_atlas_coords(E->get()), tile_map->get_cell_alternative_tile(E->get()));
|
||||
}
|
||||
undo_redo->add_undo_method(this, "_set_tile_map_selection", _get_tile_map_selection());
|
||||
@@ -441,7 +430,7 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
|
||||
if (!tile_map_selection.is_empty()) {
|
||||
undo_redo->create_action(TTR("Delete tiles"));
|
||||
for (Set<Vector2i>::Element *E = tile_map_selection.front(); E; E = E->next()) {
|
||||
undo_redo->add_do_method(tile_map, "set_cell", E->get(), -1, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
|
||||
undo_redo->add_do_method(tile_map, "set_cell", E->get(), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
|
||||
undo_redo->add_undo_method(tile_map, "set_cell", E->get(), tile_map->get_cell_source_id(E->get()), tile_map->get_cell_atlas_coords(E->get()), tile_map->get_cell_alternative_tile(E->get()));
|
||||
}
|
||||
undo_redo->add_undo_method(this, "_set_tile_map_selection", _get_tile_map_selection());
|
||||
@@ -462,12 +451,12 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
|
||||
case DRAG_TYPE_PAINT: {
|
||||
Map<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, drag_last_mouse_pos, mpos);
|
||||
for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == -1) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
|
||||
continue;
|
||||
}
|
||||
Vector2i coords = E->key();
|
||||
if (!drag_modified.has(coords)) {
|
||||
drag_modified.insert(coords, TileMapCell(tile_map->get_cell_source_id(coords), tile_map->get_cell_atlas_coords(coords), tile_map->get_cell_alternative_tile(coords)));
|
||||
drag_modified.insert(coords, tile_map->get_cell(coords));
|
||||
}
|
||||
tile_map->set_cell(coords, E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
|
||||
}
|
||||
@@ -478,12 +467,12 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
|
||||
if (!drag_modified.has(line[i])) {
|
||||
Map<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_continuous_checkbox->is_pressed());
|
||||
for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == -1) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
|
||||
continue;
|
||||
}
|
||||
Vector2i coords = E->key();
|
||||
if (!drag_modified.has(coords)) {
|
||||
drag_modified.insert(coords, TileMapCell(tile_map->get_cell_source_id(coords), tile_map->get_cell_atlas_coords(coords), tile_map->get_cell_alternative_tile(coords)));
|
||||
drag_modified.insert(coords, tile_map->get_cell(coords));
|
||||
}
|
||||
tile_map->set_cell(coords, E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
|
||||
}
|
||||
@@ -516,8 +505,8 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
|
||||
drag_modified.clear();
|
||||
for (Set<Vector2i>::Element *E = tile_map_selection.front(); E; E = E->next()) {
|
||||
Vector2i coords = E->get();
|
||||
drag_modified.insert(coords, TileMapCell(tile_map->get_cell_source_id(coords), tile_map->get_cell_atlas_coords(coords), tile_map->get_cell_alternative_tile(coords)));
|
||||
tile_map->set_cell(coords, -1, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
|
||||
drag_modified.insert(coords, tile_map->get_cell(coords));
|
||||
tile_map->set_cell(coords, TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
|
||||
}
|
||||
} else {
|
||||
// Select tiles
|
||||
@@ -536,12 +525,12 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
|
||||
drag_modified.clear();
|
||||
Map<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, mpos, mpos);
|
||||
for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == -1) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
|
||||
continue;
|
||||
}
|
||||
Vector2i coords = E->key();
|
||||
if (!drag_modified.has(coords)) {
|
||||
drag_modified.insert(coords, TileMapCell(tile_map->get_cell_source_id(coords), tile_map->get_cell_atlas_coords(coords), tile_map->get_cell_alternative_tile(coords)));
|
||||
drag_modified.insert(coords, tile_map->get_cell(coords));
|
||||
}
|
||||
tile_map->set_cell(coords, E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
|
||||
}
|
||||
@@ -562,12 +551,12 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
|
||||
if (!drag_modified.has(line[i])) {
|
||||
Map<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_continuous_checkbox->is_pressed());
|
||||
for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == -1) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
|
||||
continue;
|
||||
}
|
||||
Vector2i coords = E->key();
|
||||
if (!drag_modified.has(coords)) {
|
||||
drag_modified.insert(coords, TileMapCell(tile_map->get_cell_source_id(coords), tile_map->get_cell_atlas_coords(coords), tile_map->get_cell_alternative_tile(coords)));
|
||||
drag_modified.insert(coords, tile_map->get_cell(coords));
|
||||
}
|
||||
tile_map->set_cell(coords, E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
|
||||
}
|
||||
@@ -634,7 +623,7 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over
|
||||
for (int x = rect.position.x; x < rect.get_end().x; x++) {
|
||||
for (int y = rect.position.y; y < rect.get_end().y; y++) {
|
||||
Vector2i coords = Vector2i(x, y);
|
||||
if (tile_map->get_cell_source_id(coords) != -1) {
|
||||
if (tile_map->get_cell_source_id(coords) != TileSet::INVALID_SOURCE) {
|
||||
Rect2 cell_region = xform.xform(Rect2(tile_map->map_to_world(coords) - tile_shape_size / 2, tile_shape_size));
|
||||
tile_set->draw_tile_shape(p_overlay, cell_region, Color(1.0, 1.0, 1.0), false);
|
||||
}
|
||||
@@ -648,7 +637,7 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over
|
||||
for (int x = rect.position.x; x < rect.get_end().x; x++) {
|
||||
for (int y = rect.position.y; y < rect.get_end().y; y++) {
|
||||
Vector2i coords = Vector2i(x, y);
|
||||
if (tile_map->get_cell_source_id(coords) != -1) {
|
||||
if (tile_map->get_cell_source_id(coords) != TileSet::INVALID_SOURCE) {
|
||||
to_draw.insert(coords);
|
||||
}
|
||||
}
|
||||
@@ -871,7 +860,7 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_line(Vector2 p_start_
|
||||
|
||||
// Get or create the pattern.
|
||||
TileMapPattern erase_pattern;
|
||||
erase_pattern.set_cell(Vector2i(0, 0), -1, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
|
||||
erase_pattern.set_cell(Vector2i(0, 0), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
|
||||
TileMapPattern *pattern = erase_button->is_pressed() ? &erase_pattern : selection_pattern;
|
||||
|
||||
Map<Vector2i, TileMapCell> output;
|
||||
@@ -923,7 +912,7 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_rect(Vector2i p_start
|
||||
|
||||
// Get or create the pattern.
|
||||
TileMapPattern erase_pattern;
|
||||
erase_pattern.set_cell(Vector2i(0, 0), -1, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
|
||||
erase_pattern.set_cell(Vector2i(0, 0), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
|
||||
TileMapPattern *pattern = erase_button->is_pressed() ? &erase_pattern : selection_pattern;
|
||||
|
||||
// Compute the offset to align things to the bottom or right.
|
||||
@@ -974,7 +963,7 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_bucket_fill(Vector2i
|
||||
|
||||
// Get or create the pattern.
|
||||
TileMapPattern erase_pattern;
|
||||
erase_pattern.set_cell(Vector2i(0, 0), -1, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
|
||||
erase_pattern.set_cell(Vector2i(0, 0), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
|
||||
TileMapPattern *pattern = erase_button->is_pressed() ? &erase_pattern : selection_pattern;
|
||||
|
||||
Map<Vector2i, TileMapCell> output;
|
||||
@@ -983,7 +972,7 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_bucket_fill(Vector2i
|
||||
|
||||
// If we are filling empty tiles, compute the tilemap boundaries.
|
||||
Rect2i boundaries;
|
||||
if (source.source_id == -1) {
|
||||
if (source.source_id == TileSet::INVALID_SOURCE) {
|
||||
boundaries = tile_map->get_used_rect();
|
||||
}
|
||||
|
||||
@@ -999,7 +988,7 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_bucket_fill(Vector2i
|
||||
if (source.source_id == tile_map->get_cell_source_id(coords) &&
|
||||
source.get_atlas_coords() == tile_map->get_cell_atlas_coords(coords) &&
|
||||
source.alternative_tile == tile_map->get_cell_alternative_tile(coords) &&
|
||||
(source.source_id != -1 || boundaries.has_point(coords))) {
|
||||
(source.source_id != TileSet::INVALID_SOURCE || boundaries.has_point(coords))) {
|
||||
if (!erase_button->is_pressed() && random_tile_checkbox->is_pressed()) {
|
||||
// Paint a random tile.
|
||||
output.insert(coords, _pick_random_tile(pattern));
|
||||
@@ -1027,7 +1016,7 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_bucket_fill(Vector2i
|
||||
} else {
|
||||
// Replace all tiles like the source.
|
||||
TypedArray<Vector2i> to_check;
|
||||
if (source.source_id == -1) {
|
||||
if (source.source_id == TileSet::INVALID_SOURCE) {
|
||||
Rect2i rect = tile_map->get_used_rect();
|
||||
if (rect.size.x <= 0 || rect.size.y <= 0) {
|
||||
rect = Rect2i(p_coords, Vector2i(1, 1));
|
||||
@@ -1045,7 +1034,7 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_bucket_fill(Vector2i
|
||||
if (source.source_id == tile_map->get_cell_source_id(coords) &&
|
||||
source.get_atlas_coords() == tile_map->get_cell_atlas_coords(coords) &&
|
||||
source.alternative_tile == tile_map->get_cell_alternative_tile(coords) &&
|
||||
(source.source_id != -1 || boundaries.has_point(coords))) {
|
||||
(source.source_id != TileSet::INVALID_SOURCE || boundaries.has_point(coords))) {
|
||||
if (!erase_button->is_pressed() && random_tile_checkbox->is_pressed()) {
|
||||
// Paint a random tile.
|
||||
output.insert(coords, _pick_random_tile(pattern));
|
||||
@@ -1102,7 +1091,7 @@ void TileMapEditorTilesPlugin::_stop_dragging() {
|
||||
tile_map_selection.erase(coords);
|
||||
}
|
||||
} else {
|
||||
if (tile_map->get_cell_source_id(coords) != -1) {
|
||||
if (tile_map->get_cell_source_id(coords) != TileSet::INVALID_SOURCE) {
|
||||
tile_map_selection.insert(coords);
|
||||
}
|
||||
}
|
||||
@@ -1173,7 +1162,7 @@ void TileMapEditorTilesPlugin::_stop_dragging() {
|
||||
for (int x = rect.position.x; x < rect.get_end().x; x++) {
|
||||
for (int y = rect.position.y; y < rect.get_end().y; y++) {
|
||||
Vector2i coords = Vector2i(x, y);
|
||||
if (tile_map->get_cell_source_id(coords) != -1) {
|
||||
if (tile_map->get_cell_source_id(coords) != TileSet::INVALID_SOURCE) {
|
||||
coords_array.push_back(coords);
|
||||
}
|
||||
}
|
||||
@@ -1198,7 +1187,7 @@ void TileMapEditorTilesPlugin::_stop_dragging() {
|
||||
Map<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, drag_start_mouse_pos, mpos);
|
||||
undo_redo->create_action(TTR("Paint tiles"));
|
||||
for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == -1) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
|
||||
continue;
|
||||
}
|
||||
undo_redo->add_do_method(tile_map, "set_cell", E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
|
||||
@@ -1210,7 +1199,7 @@ void TileMapEditorTilesPlugin::_stop_dragging() {
|
||||
Map<Vector2i, TileMapCell> to_draw = _draw_rect(tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(mpos));
|
||||
undo_redo->create_action(TTR("Paint tiles"));
|
||||
for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == -1) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
|
||||
continue;
|
||||
}
|
||||
undo_redo->add_do_method(tile_map, "set_cell", E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
|
||||
@@ -1221,7 +1210,7 @@ void TileMapEditorTilesPlugin::_stop_dragging() {
|
||||
case DRAG_TYPE_BUCKET: {
|
||||
undo_redo->create_action(TTR("Paint tiles"));
|
||||
for (Map<Vector2i, TileMapCell>::Element *E = drag_modified.front(); E; E = E->next()) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == -1) {
|
||||
if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
|
||||
continue;
|
||||
}
|
||||
undo_redo->add_do_method(tile_map, "set_cell", E->key(), tile_map->get_cell_source_id(E->key()), tile_map->get_cell_atlas_coords(E->key()), tile_map->get_cell_alternative_tile(E->key()));
|
||||
@@ -1249,7 +1238,7 @@ void TileMapEditorTilesPlugin::_stop_dragging() {
|
||||
void TileMapEditorTilesPlugin::_update_fix_selected_and_hovered() {
|
||||
TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id));
|
||||
if (!tile_map) {
|
||||
hovered_tile.source_id = -1;
|
||||
hovered_tile.source_id = TileSet::INVALID_SOURCE;
|
||||
hovered_tile.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS);
|
||||
hovered_tile.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE;
|
||||
tile_set_selection.clear();
|
||||
@@ -1260,7 +1249,7 @@ void TileMapEditorTilesPlugin::_update_fix_selected_and_hovered() {
|
||||
|
||||
Ref<TileSet> tile_set = tile_map->get_tileset();
|
||||
if (!tile_set.is_valid()) {
|
||||
hovered_tile.source_id = -1;
|
||||
hovered_tile.source_id = TileSet::INVALID_SOURCE;
|
||||
hovered_tile.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS);
|
||||
hovered_tile.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE;
|
||||
tile_set_selection.clear();
|
||||
@@ -1271,7 +1260,7 @@ void TileMapEditorTilesPlugin::_update_fix_selected_and_hovered() {
|
||||
|
||||
int source_index = sources_list->get_current();
|
||||
if (source_index < 0 || source_index >= sources_list->get_item_count()) {
|
||||
hovered_tile.source_id = -1;
|
||||
hovered_tile.source_id = TileSet::INVALID_SOURCE;
|
||||
hovered_tile.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS);
|
||||
hovered_tile.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE;
|
||||
tile_set_selection.clear();
|
||||
@@ -1287,7 +1276,7 @@ void TileMapEditorTilesPlugin::_update_fix_selected_and_hovered() {
|
||||
!tile_set->has_source(hovered_tile.source_id) ||
|
||||
!tile_set->get_source(hovered_tile.source_id)->has_tile(hovered_tile.get_atlas_coords()) ||
|
||||
!tile_set->get_source(hovered_tile.source_id)->has_alternative_tile(hovered_tile.get_atlas_coords(), hovered_tile.alternative_tile)) {
|
||||
hovered_tile.source_id = -1;
|
||||
hovered_tile.source_id = TileSet::INVALID_SOURCE;
|
||||
hovered_tile.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS);
|
||||
hovered_tile.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE;
|
||||
}
|
||||
@@ -1403,7 +1392,7 @@ void TileMapEditorTilesPlugin::_update_tileset_selection_from_selection_pattern(
|
||||
TypedArray<Vector2i> used_cells = selection_pattern->get_used_cells();
|
||||
for (int i = 0; i < used_cells.size(); i++) {
|
||||
Vector2i coords = used_cells[i];
|
||||
if (selection_pattern->get_cell_source_id(coords) != -1) {
|
||||
if (selection_pattern->get_cell_source_id(coords) != TileSet::INVALID_SOURCE) {
|
||||
tile_set_selection.insert(TileMapCell(selection_pattern->get_cell_source_id(coords), selection_pattern->get_cell_atlas_coords(coords), selection_pattern->get_cell_alternative_tile(coords)));
|
||||
}
|
||||
}
|
||||
@@ -1475,7 +1464,7 @@ void TileMapEditorTilesPlugin::_tile_atlas_control_draw() {
|
||||
}
|
||||
|
||||
void TileMapEditorTilesPlugin::_tile_atlas_control_mouse_exited() {
|
||||
hovered_tile.source_id = -1;
|
||||
hovered_tile.source_id = TileSet::INVALID_SOURCE;
|
||||
hovered_tile.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS);
|
||||
hovered_tile.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE;
|
||||
tile_set_dragging_selection = false;
|
||||
@@ -1634,7 +1623,7 @@ void TileMapEditorTilesPlugin::_tile_alternatives_control_draw() {
|
||||
}
|
||||
|
||||
void TileMapEditorTilesPlugin::_tile_alternatives_control_mouse_exited() {
|
||||
hovered_tile.source_id = -1;
|
||||
hovered_tile.source_id = TileSet::INVALID_SOURCE;
|
||||
hovered_tile.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS);
|
||||
hovered_tile.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE;
|
||||
tile_set_dragging_selection = false;
|
||||
@@ -1856,19 +1845,6 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() {
|
||||
|
||||
_on_random_tile_checkbox_toggled(false);
|
||||
|
||||
// Wide empty separation control.
|
||||
Control *h_empty_space = memnew(Control);
|
||||
h_empty_space->set_h_size_flags(SIZE_EXPAND_FILL);
|
||||
toolbar->add_child(h_empty_space);
|
||||
|
||||
// Grid toggle.
|
||||
toggle_grid_button = memnew(Button);
|
||||
toggle_grid_button->set_flat(true);
|
||||
toggle_grid_button->set_toggle_mode(true);
|
||||
toggle_grid_button->set_tooltip(TTR("Toggle grid visibility."));
|
||||
toggle_grid_button->connect("toggled", callable_mp(this, &TileMapEditorTilesPlugin::_on_grid_toggled));
|
||||
toolbar->add_child(toggle_grid_button);
|
||||
|
||||
// Default tool.
|
||||
paint_tool_button->set_pressed(true);
|
||||
_update_toolbar();
|
||||
@@ -1898,8 +1874,8 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() {
|
||||
sources_list->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST);
|
||||
sources_list->connect("item_selected", callable_mp(this, &TileMapEditorTilesPlugin::_update_fix_selected_and_hovered).unbind(1));
|
||||
sources_list->connect("item_selected", callable_mp(this, &TileMapEditorTilesPlugin::_update_bottom_panel).unbind(1));
|
||||
sources_list->connect("item_selected", callable_mp(TilesEditor::get_singleton(), &TilesEditor::set_atlas_sources_lists_current));
|
||||
sources_list->connect("visibility_changed", callable_mp(TilesEditor::get_singleton(), &TilesEditor::synchronize_atlas_sources_list), varray(sources_list));
|
||||
sources_list->connect("item_selected", callable_mp(TilesEditor::get_singleton(), &TilesEditor::set_sources_lists_current));
|
||||
sources_list->connect("visibility_changed", callable_mp(TilesEditor::get_singleton(), &TilesEditor::synchronize_sources_list), varray(sources_list));
|
||||
atlas_sources_split_container->add_child(sources_list);
|
||||
|
||||
// Tile atlas source.
|
||||
@@ -2968,7 +2944,7 @@ void TileMapEditorTerrainsPlugin::_update_terrains_cache() {
|
||||
}
|
||||
|
||||
TileMapCell empty_cell;
|
||||
empty_cell.source_id = -1;
|
||||
empty_cell.source_id = TileSet::INVALID_SOURCE;
|
||||
empty_cell.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS);
|
||||
empty_cell.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE;
|
||||
per_terrain_terrains_tile_patterns_tiles[i][empty_pattern].insert(empty_cell);
|
||||
@@ -3190,6 +3166,9 @@ void TileMapEditor::_notification(int p_what) {
|
||||
case NOTIFICATION_THEME_CHANGED:
|
||||
missing_tile_texture = get_theme_icon(SNAME("StatusWarning"), SNAME("EditorIcons"));
|
||||
warning_pattern_texture = get_theme_icon(SNAME("WarningPattern"), SNAME("EditorIcons"));
|
||||
advanced_menu_button->set_icon(get_theme_icon(SNAME("Tools"), SNAME("EditorIcons")));
|
||||
toggle_grid_button->set_icon(get_theme_icon(SNAME("Grid"), SNAME("EditorIcons")));
|
||||
toggle_grid_button->set_pressed(EditorSettings::get_singleton()->get("editors/tiles_editor/display_grid"));
|
||||
break;
|
||||
case NOTIFICATION_INTERNAL_PROCESS:
|
||||
if (is_visible_in_tree() && tileset_changed_needs_update) {
|
||||
@@ -3199,6 +3178,44 @@ void TileMapEditor::_notification(int p_what) {
|
||||
tileset_changed_needs_update = false;
|
||||
}
|
||||
break;
|
||||
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED:
|
||||
toggle_grid_button->set_pressed(EditorSettings::get_singleton()->get("editors/tiles_editor/display_grid"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void TileMapEditor::_on_grid_toggled(bool p_pressed) {
|
||||
EditorSettings::get_singleton()->set("editors/tiles_editor/display_grid", p_pressed);
|
||||
}
|
||||
|
||||
void TileMapEditor::_advanced_menu_button_id_pressed(int p_id) {
|
||||
TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id));
|
||||
if (!tile_map) {
|
||||
return;
|
||||
}
|
||||
|
||||
Ref<TileSet> tile_set = tile_map->get_tileset();
|
||||
if (!tile_set.is_valid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (p_id == 0) { // Replace Tile Proxies
|
||||
undo_redo->create_action(TTR("Replace Tiles with Proxies"));
|
||||
TypedArray<Vector2i> used_cells = tile_map->get_used_cells();
|
||||
for (int i = 0; i < used_cells.size(); i++) {
|
||||
Vector2i cell_coords = used_cells[i];
|
||||
TileMapCell from = tile_map->get_cell(cell_coords);
|
||||
Array to_array = tile_set->map_tile_proxy(from.source_id, from.get_atlas_coords(), from.alternative_tile);
|
||||
TileMapCell to;
|
||||
to.source_id = to_array[0];
|
||||
to.set_atlas_coords(to_array[1]);
|
||||
to.alternative_tile = to_array[2];
|
||||
if (from != to) {
|
||||
undo_redo->add_do_method(tile_map, "set_cell", cell_coords, to.source_id, to.get_atlas_coords(), to.alternative_tile);
|
||||
undo_redo->add_undo_method(tile_map, "set_cell", cell_coords, from.source_id, from.get_atlas_coords(), from.alternative_tile);
|
||||
}
|
||||
}
|
||||
undo_redo->commit_action();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3349,7 +3366,6 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
|
||||
Vector2i tile_shape_size = tile_set->get_tile_size();
|
||||
|
||||
// Draw tiles with invalid IDs in the grid.
|
||||
float icon_ratio = MIN(missing_tile_texture->get_size().x / tile_set->get_tile_size().x, missing_tile_texture->get_size().y / tile_set->get_tile_size().y) / 3;
|
||||
TypedArray<Vector2i> used_cells = tile_map->get_used_cells();
|
||||
for (int i = 0; i < used_cells.size(); i++) {
|
||||
Vector2i coords = used_cells[i];
|
||||
@@ -3365,25 +3381,33 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
|
||||
|
||||
if (!source || !source->has_tile(tile_atlas_coords) || !source->has_alternative_tile(tile_atlas_coords, tile_alternative_tile)) {
|
||||
// Generate a random color from the hashed values of the tiles.
|
||||
Array to_hash;
|
||||
to_hash.push_back(tile_source_id);
|
||||
to_hash.push_back(tile_atlas_coords);
|
||||
to_hash.push_back(tile_alternative_tile);
|
||||
uint32_t hash = RandomPCG(to_hash.hash()).rand();
|
||||
Array a = tile_set->map_tile_proxy(tile_source_id, tile_atlas_coords, tile_alternative_tile);
|
||||
if (int(a[0]) == tile_source_id && Vector2i(a[1]) == tile_atlas_coords && int(a[2]) == tile_alternative_tile) {
|
||||
// Only display the pattern if we have no proxy tile.
|
||||
Array to_hash;
|
||||
to_hash.push_back(tile_source_id);
|
||||
to_hash.push_back(tile_atlas_coords);
|
||||
to_hash.push_back(tile_alternative_tile);
|
||||
uint32_t hash = RandomPCG(to_hash.hash()).rand();
|
||||
|
||||
Color color;
|
||||
color = color.from_hsv(
|
||||
(float)((hash >> 24) & 0xFF) / 256.0,
|
||||
Math::lerp(0.5, 1.0, (float)((hash >> 16) & 0xFF) / 256.0),
|
||||
Math::lerp(0.5, 1.0, (float)((hash >> 8) & 0xFF) / 256.0),
|
||||
0.8);
|
||||
Color color;
|
||||
color = color.from_hsv(
|
||||
(float)((hash >> 24) & 0xFF) / 256.0,
|
||||
Math::lerp(0.5, 1.0, (float)((hash >> 16) & 0xFF) / 256.0),
|
||||
Math::lerp(0.5, 1.0, (float)((hash >> 8) & 0xFF) / 256.0),
|
||||
0.8);
|
||||
|
||||
// Draw the scaled tile.
|
||||
Rect2 cell_region = xform.xform(Rect2(tile_map->map_to_world(coords) - Vector2(tile_shape_size) / 2, Vector2(tile_shape_size)));
|
||||
tile_set->draw_tile_shape(p_overlay, cell_region, color, true, warning_pattern_texture);
|
||||
// Draw the scaled tile.
|
||||
Rect2 cell_region = xform.xform(Rect2(tile_map->map_to_world(coords) - Vector2(tile_shape_size) / 2, Vector2(tile_shape_size)));
|
||||
tile_set->draw_tile_shape(p_overlay, cell_region, color, true, warning_pattern_texture);
|
||||
}
|
||||
|
||||
// Draw the warning icon.
|
||||
Rect2 rect = Rect2(xform.xform(tile_map->map_to_world(coords)) - (icon_ratio * missing_tile_texture->get_size() * xform.get_scale() / 2), icon_ratio * missing_tile_texture->get_size() * xform.get_scale());
|
||||
int min_axis = missing_tile_texture->get_size().min_axis();
|
||||
Vector2 icon_size;
|
||||
icon_size[min_axis] = tile_set->get_tile_size()[min_axis] / 3;
|
||||
icon_size[(min_axis + 1) % 2] = (icon_size[min_axis] * missing_tile_texture->get_size()[(min_axis + 1) % 2] / missing_tile_texture->get_size()[min_axis]);
|
||||
Rect2 rect = Rect2(xform.xform(tile_map->map_to_world(coords)) - (icon_size * xform.get_scale() / 2), icon_size * xform.get_scale());
|
||||
p_overlay->draw_texture_rect(missing_tile_texture, rect);
|
||||
}
|
||||
}
|
||||
@@ -3503,6 +3527,26 @@ TileMapEditor::TileMapEditor() {
|
||||
tilemap_toolbar->add_child(tile_map_editor_plugins[i]->get_toolbar());
|
||||
}
|
||||
|
||||
// Wide empty separation control.
|
||||
Control *h_empty_space = memnew(Control);
|
||||
h_empty_space->set_h_size_flags(SIZE_EXPAND_FILL);
|
||||
tilemap_toolbar->add_child(h_empty_space);
|
||||
|
||||
// Grid toggle.
|
||||
toggle_grid_button = memnew(Button);
|
||||
toggle_grid_button->set_flat(true);
|
||||
toggle_grid_button->set_toggle_mode(true);
|
||||
toggle_grid_button->set_tooltip(TTR("Toggle grid visibility."));
|
||||
toggle_grid_button->connect("toggled", callable_mp(this, &TileMapEditor::_on_grid_toggled));
|
||||
tilemap_toolbar->add_child(toggle_grid_button);
|
||||
|
||||
// Advanced settings menu button.
|
||||
advanced_menu_button = memnew(MenuButton);
|
||||
advanced_menu_button->set_flat(true);
|
||||
advanced_menu_button->get_popup()->add_item(TTR("Automatically Replace Tiles with Proxies"));
|
||||
advanced_menu_button->get_popup()->connect("id_pressed", callable_mp(this, &TileMapEditor::_advanced_menu_button_id_pressed));
|
||||
tilemap_toolbar->add_child(advanced_menu_button);
|
||||
|
||||
missing_tileset_label = memnew(Label);
|
||||
missing_tileset_label->set_text(TTR("The edited TileMap node has no TileSet resource."));
|
||||
missing_tileset_label->set_h_size_flags(SIZE_EXPAND_FILL);
|
||||
|
||||
Reference in New Issue
Block a user