diff options
Diffstat (limited to 'editor/plugins/tiles/tile_data_editors.cpp')
-rw-r--r-- | editor/plugins/tiles/tile_data_editors.cpp | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/editor/plugins/tiles/tile_data_editors.cpp b/editor/plugins/tiles/tile_data_editors.cpp index 8dbf58e228..79915012a8 100644 --- a/editor/plugins/tiles/tile_data_editors.cpp +++ b/editor/plugins/tiles/tile_data_editors.cpp @@ -1482,30 +1482,36 @@ void TileDataOcclusionShapeEditor::draw_over_tile(CanvasItem *p_canvas_item, Tra debug_occlusion_color.push_back(color); RenderingServer::get_singleton()->canvas_item_add_set_transform(p_canvas_item->get_canvas_item(), p_transform); - Ref<OccluderPolygon2D> occluder = tile_data->get_occluder(occlusion_layer); - if (occluder.is_valid() && occluder->get_polygon().size() >= 3) { - p_canvas_item->draw_polygon(Variant(occluder->get_polygon()), debug_occlusion_color); + for (int i = 0; i < tile_data->get_occluder_polygons_count(occlusion_layer); i++) { + Ref<OccluderPolygon2D> occluder = tile_data->get_occluder_polygon(occlusion_layer, i); + if (occluder.is_valid() && occluder->get_polygon().size() >= 3) { + p_canvas_item->draw_polygon(Variant(occluder->get_polygon()), debug_occlusion_color); + } } RenderingServer::get_singleton()->canvas_item_add_set_transform(p_canvas_item->get_canvas_item(), Transform2D()); } Variant TileDataOcclusionShapeEditor::_get_painted_value() { - Ref<OccluderPolygon2D> occluder_polygon; - if (polygon_editor->get_polygon_count() >= 1) { + Array polygons; + for (int i = 0; i < polygon_editor->get_polygon_count(); i++) { + Ref<OccluderPolygon2D> occluder_polygon; occluder_polygon.instantiate(); - occluder_polygon->set_polygon(polygon_editor->get_polygon(0)); + occluder_polygon->set_polygon(polygon_editor->get_polygon(i)); + polygons.push_back(occluder_polygon); } - return occluder_polygon; + return polygons; } void TileDataOcclusionShapeEditor::_set_painted_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile) { TileData *tile_data = p_tile_set_atlas_source->get_tile_data(p_coords, p_alternative_tile); ERR_FAIL_NULL(tile_data); - Ref<OccluderPolygon2D> occluder_polygon = tile_data->get_occluder(occlusion_layer); polygon_editor->clear_polygons(); - if (occluder_polygon.is_valid()) { - polygon_editor->add_polygon(occluder_polygon->get_polygon()); + for (int i = 0; i < tile_data->get_occluder_polygons_count(occlusion_layer); i++) { + Ref<OccluderPolygon2D> occluder_polygon = tile_data->get_occluder_polygon(occlusion_layer, i); + if (occluder_polygon.is_valid()) { + polygon_editor->add_polygon(occluder_polygon->get_polygon()); + } } polygon_editor->set_background_tile(p_tile_set_atlas_source, p_coords, p_alternative_tile); } @@ -1513,8 +1519,13 @@ void TileDataOcclusionShapeEditor::_set_painted_value(TileSetAtlasSource *p_tile void TileDataOcclusionShapeEditor::_set_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile, const Variant &p_value) { TileData *tile_data = p_tile_set_atlas_source->get_tile_data(p_coords, p_alternative_tile); ERR_FAIL_NULL(tile_data); - Ref<OccluderPolygon2D> occluder_polygon = p_value; - tile_data->set_occluder(occlusion_layer, occluder_polygon); + + Array polygons = p_value; + tile_data->set_occluder_polygons_count(occlusion_layer, polygons.size()); + for (int i = 0; i < polygons.size(); i++) { + Ref<OccluderPolygon2D> occluder_polygon = polygons[i]; + tile_data->set_occluder_polygon(occlusion_layer, i, occluder_polygon); + } polygon_editor->set_background_tile(p_tile_set_atlas_source, p_coords, p_alternative_tile); } @@ -1522,7 +1533,11 @@ void TileDataOcclusionShapeEditor::_set_value(TileSetAtlasSource *p_tile_set_atl Variant TileDataOcclusionShapeEditor::_get_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile) { TileData *tile_data = p_tile_set_atlas_source->get_tile_data(p_coords, p_alternative_tile); ERR_FAIL_NULL_V(tile_data, Variant()); - return tile_data->get_occluder(occlusion_layer); + Array polygons; + for (int i = 0; i < tile_data->get_occluder_polygons_count(occlusion_layer); i++) { + polygons.push_back(tile_data->get_occluder_polygon(occlusion_layer, i)); + } + return polygons; } void TileDataOcclusionShapeEditor::_setup_undo_redo_action(TileSetAtlasSource *p_tile_set_atlas_source, const HashMap<TileMapCell, Variant, TileMapCell> &p_previous_values, const Variant &p_new_value) { @@ -1548,6 +1563,7 @@ void TileDataOcclusionShapeEditor::_notification(int p_what) { TileDataOcclusionShapeEditor::TileDataOcclusionShapeEditor() { polygon_editor = memnew(GenericTilePolygonEditor); + polygon_editor->set_multiple_polygon_mode(true); add_child(polygon_editor); } |