Skip to content

Commit d5c0a11

Browse files
committed
Merge pull request #107890 from Nikitf777/polygon2d-editor-highlighting
Highlight points on hover in the Polygon2D editor
2 parents 30d753c + 209986b commit d5c0a11

File tree

2 files changed

+59
-7
lines changed

2 files changed

+59
-7
lines changed

editor/scene/2d/polygon_2d_editor_plugin.cpp

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,9 @@ void Polygon2DEditor::_canvas_input(const Ref<InputEvent> &p_input) {
595595
if (closest == -1) {
596596
return;
597597
}
598+
if (closest == hovered_point) {
599+
hovered_point = -1;
600+
}
598601

599602
previous_polygon.remove_at(closest);
600603
previous_uv.remove_at(closest);
@@ -786,6 +789,40 @@ void Polygon2DEditor::_canvas_input(const Ref<InputEvent> &p_input) {
786789
Ref<InputEventMouseMotion> mm = p_input;
787790

788791
if (mm.is_valid()) {
792+
// Highlight a point near the cursor.
793+
if (is_creating) {
794+
if (editing_points.size() > 2 && mtx.affine_inverse().xform(mm->get_position()).distance_to(node->get_polygon()[0]) < (8 / draw_zoom)) {
795+
if (hovered_point != 0) {
796+
hovered_point = 0;
797+
canvas->queue_redraw();
798+
}
799+
} else if (hovered_point == 0) {
800+
hovered_point = -1;
801+
canvas->queue_redraw();
802+
}
803+
}
804+
if (selected_action == ACTION_REMOVE_INTERNAL || selected_action == ACTION_EDIT_POINT || selected_action == ACTION_ADD_POLYGON) {
805+
Vector<Vector2> points;
806+
if (current_mode == MODE_POINTS || current_mode == MODE_POLYGONS) {
807+
points = node->get_polygon();
808+
} else {
809+
points = node->get_uv();
810+
}
811+
int i = points.size() - 1;
812+
for (; i >= 0; i--) {
813+
if (mtx.affine_inverse().xform(mm->get_position()).distance_to(points[i]) < (8 / draw_zoom)) {
814+
if (hovered_point != i) {
815+
hovered_point = i;
816+
canvas->queue_redraw();
817+
}
818+
break;
819+
}
820+
}
821+
if (i == -1 && hovered_point >= 0) {
822+
hovered_point = -1;
823+
canvas->queue_redraw();
824+
}
825+
}
789826
if (is_dragging) {
790827
Vector2 uv_drag_to = mm->get_position();
791828
uv_drag_to = snap_point(uv_drag_to);
@@ -1183,17 +1220,31 @@ void Polygon2DEditor::_canvas_draw() {
11831220
}
11841221
}
11851222

1186-
for (int i = 0; i < uvs.size(); i++) {
1187-
if (weight_r) {
1223+
if (weight_r) {
1224+
for (int i = 0; i < uvs.size(); i++) {
11881225
Vector2 draw_pos = mtx.xform(uvs[i]);
11891226
float weight = weight_r[i];
11901227
canvas->draw_rect(Rect2(draw_pos - Vector2(2, 2) * EDSCALE, Vector2(5, 5) * EDSCALE), Color(weight, weight, weight, 1.0), Math::round(EDSCALE));
1191-
} else {
1192-
if (i < uv_draw_max) {
1193-
canvas->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5);
1228+
}
1229+
} else {
1230+
Vector2 texture_size_half = handle->get_size() * 0.5;
1231+
Color mod(1, 1, 1);
1232+
Color hovered_mod(0.65, 0.65, 0.65);
1233+
for (int i = 0; i < uv_draw_max; i++) {
1234+
if (i == hovered_point && selected_action != ACTION_REMOVE_INTERNAL) {
1235+
canvas->draw_texture(handle, mtx.xform(uvs[i]) - texture_size_half, hovered_mod);
1236+
} else {
1237+
canvas->draw_texture(handle, mtx.xform(uvs[i]) - texture_size_half, mod);
1238+
}
1239+
}
1240+
// Internal vertices.
1241+
mod = Color(0.6, 0.8, 1);
1242+
hovered_mod = Color(0.35, 0.55, 0.75);
1243+
for (int i = uv_draw_max; i < uvs.size(); i++) {
1244+
if (i == hovered_point) {
1245+
canvas->draw_texture(handle, mtx.xform(uvs[i]) - texture_size_half, hovered_mod);
11941246
} else {
1195-
// Internal vertex
1196-
canvas->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5, Color(0.6, 0.8, 1));
1247+
canvas->draw_texture(handle, mtx.xform(uvs[i]) - texture_size_half, mod);
11971248
}
11981249
}
11991250
}

editor/scene/2d/polygon_2d_editor_plugin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
135135
int point_drag_index = -1;
136136
bool is_dragging = false;
137137
bool is_creating = false;
138+
int hovered_point = -1;
138139
Vector<int> polygon_create;
139140
Action current_action = ACTION_CREATE;
140141
Vector2 drag_from;

0 commit comments

Comments
 (0)