Skip to content

Commit 857288d

Browse files
committed
Highlight points on hover in the Polygon2D editor
1 parent d7bdc0b commit 857288d

File tree

2 files changed

+63
-7
lines changed

2 files changed

+63
-7
lines changed

editor/plugins/polygon_2d_editor_plugin.cpp

Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,9 @@ void Polygon2DEditor::_canvas_input(const Ref<InputEvent> &p_input) {
589589
if (closest == -1) {
590590
return;
591591
}
592+
if (closest == hovered_point) {
593+
hovered_point = -1;
594+
}
592595

593596
previous_polygon.remove_at(closest);
594597
previous_uv.remove_at(closest);
@@ -776,6 +779,40 @@ void Polygon2DEditor::_canvas_input(const Ref<InputEvent> &p_input) {
776779
Ref<InputEventMouseMotion> mm = p_input;
777780

778781
if (mm.is_valid()) {
782+
// Highlight a point near the cursor.
783+
if (is_creating) {
784+
if (editing_points.size() > 2 && mtx.affine_inverse().xform(mm->get_position()).distance_to(node->get_polygon()[0]) < (8 / draw_zoom)) {
785+
if (hovered_point != 0) {
786+
hovered_point = 0;
787+
canvas->queue_redraw();
788+
}
789+
} else if (hovered_point == 0) {
790+
hovered_point = -1;
791+
canvas->queue_redraw();
792+
}
793+
}
794+
if (selected_action == ACTION_REMOVE_INTERNAL || selected_action == ACTION_EDIT_POINT || selected_action == ACTION_ADD_POLYGON) {
795+
Vector<Vector2> points;
796+
if (current_mode == MODE_POINTS || current_mode == MODE_POLYGONS) {
797+
points = node->get_polygon();
798+
} else {
799+
points = node->get_uv();
800+
}
801+
int i = points.size() - 1;
802+
for (; i >= 0; i--) {
803+
if (mtx.affine_inverse().xform(mm->get_position()).distance_to(points[i]) < (8 / draw_zoom)) {
804+
if (hovered_point != i) {
805+
hovered_point = i;
806+
canvas->queue_redraw();
807+
}
808+
break;
809+
}
810+
}
811+
if (i == -1 && hovered_point >= 0) {
812+
hovered_point = -1;
813+
canvas->queue_redraw();
814+
}
815+
}
779816
if (is_dragging) {
780817
Vector2 uv_drag_to = mm->get_position();
781818
uv_drag_to = snap_point(uv_drag_to);
@@ -1173,18 +1210,36 @@ void Polygon2DEditor::_canvas_draw() {
11731210
}
11741211
}
11751212

1176-
for (int i = 0; i < uvs.size(); i++) {
1177-
if (weight_r) {
1213+
if (weight_r) {
1214+
for (int i = 0; i < uvs.size(); i++) {
11781215
Vector2 draw_pos = mtx.xform(uvs[i]);
11791216
float weight = weight_r[i];
11801217
canvas->draw_rect(Rect2(draw_pos - Vector2(2, 2) * EDSCALE, Vector2(5, 5) * EDSCALE), Color(weight, weight, weight, 1.0), Math::round(EDSCALE));
1181-
} else {
1182-
if (i < uv_draw_max) {
1183-
canvas->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5);
1218+
}
1219+
} else {
1220+
Vector2 texture_size_half = handle->get_size() * 0.5;
1221+
Color mod(1, 1, 1);
1222+
Color hovered_mod(0.65, 0.65, 0.65);
1223+
for (int i = 0; i < uv_draw_max; i++) {
1224+
if (i == hovered_point && selected_action != ACTION_REMOVE_INTERNAL) {
1225+
canvas->draw_texture(handle, mtx.xform(uvs[i]) - texture_size_half, hovered_mod);
11841226
} else {
1185-
// Internal vertex
1186-
canvas->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5, Color(0.6, 0.8, 1));
1227+
canvas->draw_texture(handle, mtx.xform(uvs[i]) - texture_size_half, mod);
1228+
}
1229+
}
1230+
// Internal vertices.
1231+
mod = Color(0.6, 0.8, 1);
1232+
hovered_mod = Color(0.35, 0.55, 0.75);
1233+
for (int i = uv_draw_max; i < uvs.size(); i++) {
1234+
if (i == hovered_point) {
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+
if (i == hovered_point) {
1240+
mod -= highlight;
11871241
}
1242+
canvas->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5, mod);
11881243
}
11891244
}
11901245

editor/plugins/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)