diff --git a/editor/scene/2d/polygon_2d_editor_plugin.cpp b/editor/scene/2d/polygon_2d_editor_plugin.cpp index 04a1100832f..895ad938e1d 100644 --- a/editor/scene/2d/polygon_2d_editor_plugin.cpp +++ b/editor/scene/2d/polygon_2d_editor_plugin.cpp @@ -595,6 +595,9 @@ void Polygon2DEditor::_canvas_input(const Ref &p_input) { if (closest == -1) { return; } + if (closest == hovered_point) { + hovered_point = -1; + } previous_polygon.remove_at(closest); previous_uv.remove_at(closest); @@ -786,6 +789,40 @@ void Polygon2DEditor::_canvas_input(const Ref &p_input) { Ref mm = p_input; if (mm.is_valid()) { + // Highlight a point near the cursor. + if (is_creating) { + if (editing_points.size() > 2 && mtx.affine_inverse().xform(mm->get_position()).distance_to(node->get_polygon()[0]) < (8 / draw_zoom)) { + if (hovered_point != 0) { + hovered_point = 0; + canvas->queue_redraw(); + } + } else if (hovered_point == 0) { + hovered_point = -1; + canvas->queue_redraw(); + } + } + if (selected_action == ACTION_REMOVE_INTERNAL || selected_action == ACTION_EDIT_POINT || selected_action == ACTION_ADD_POLYGON) { + Vector points; + if (current_mode == MODE_POINTS || current_mode == MODE_POLYGONS) { + points = node->get_polygon(); + } else { + points = node->get_uv(); + } + int i = points.size() - 1; + for (; i >= 0; i--) { + if (mtx.affine_inverse().xform(mm->get_position()).distance_to(points[i]) < (8 / draw_zoom)) { + if (hovered_point != i) { + hovered_point = i; + canvas->queue_redraw(); + } + break; + } + } + if (i == -1 && hovered_point >= 0) { + hovered_point = -1; + canvas->queue_redraw(); + } + } if (is_dragging) { Vector2 uv_drag_to = mm->get_position(); uv_drag_to = snap_point(uv_drag_to); @@ -1183,17 +1220,31 @@ void Polygon2DEditor::_canvas_draw() { } } - for (int i = 0; i < uvs.size(); i++) { - if (weight_r) { + if (weight_r) { + for (int i = 0; i < uvs.size(); i++) { Vector2 draw_pos = mtx.xform(uvs[i]); float weight = weight_r[i]; canvas->draw_rect(Rect2(draw_pos - Vector2(2, 2) * EDSCALE, Vector2(5, 5) * EDSCALE), Color(weight, weight, weight, 1.0), Math::round(EDSCALE)); - } else { - if (i < uv_draw_max) { - canvas->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5); + } + } else { + Vector2 texture_size_half = handle->get_size() * 0.5; + Color mod(1, 1, 1); + Color hovered_mod(0.65, 0.65, 0.65); + for (int i = 0; i < uv_draw_max; i++) { + if (i == hovered_point && selected_action != ACTION_REMOVE_INTERNAL) { + canvas->draw_texture(handle, mtx.xform(uvs[i]) - texture_size_half, hovered_mod); } else { - // Internal vertex - canvas->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5, Color(0.6, 0.8, 1)); + canvas->draw_texture(handle, mtx.xform(uvs[i]) - texture_size_half, mod); + } + } + // Internal vertices. + mod = Color(0.6, 0.8, 1); + hovered_mod = Color(0.35, 0.55, 0.75); + for (int i = uv_draw_max; i < uvs.size(); i++) { + if (i == hovered_point) { + canvas->draw_texture(handle, mtx.xform(uvs[i]) - texture_size_half, hovered_mod); + } else { + canvas->draw_texture(handle, mtx.xform(uvs[i]) - texture_size_half, mod); } } } diff --git a/editor/scene/2d/polygon_2d_editor_plugin.h b/editor/scene/2d/polygon_2d_editor_plugin.h index e145a39f10b..add2d70772b 100644 --- a/editor/scene/2d/polygon_2d_editor_plugin.h +++ b/editor/scene/2d/polygon_2d_editor_plugin.h @@ -135,6 +135,7 @@ class Polygon2DEditor : public AbstractPolygon2DEditor { int point_drag_index = -1; bool is_dragging = false; bool is_creating = false; + int hovered_point = -1; Vector polygon_create; Action current_action = ACTION_CREATE; Vector2 drag_from;