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