@@ -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
0 commit comments