mirror of
https://github.com/godotengine/godot.git
synced 2025-10-31 21:51:22 +00:00
Implement multiple occlusion polygons within each TileSet occlusion layer
This commit is contained in:
parent
8120e0324a
commit
d75c5ec7ba
8 changed files with 345 additions and 114 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue