Browse Source

Merge pull request #12195 from groud/fix_snapping

Fix snapping with 2D nodes

[ci skip]
Rémi Verschelde 8 years ago
parent
commit
84251d7aec

+ 4 - 4
editor/editor_node.cpp

@@ -5691,12 +5691,12 @@ void EditorPluginList::edit(Object *p_object) {
 	}
 	}
 }
 }
 
 
-bool EditorPluginList::forward_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) {
+bool EditorPluginList::forward_gui_input(const Ref<InputEvent> &p_event) {
 
 
 	bool discard = false;
 	bool discard = false;
 
 
 	for (int i = 0; i < plugins_list.size(); i++) {
 	for (int i = 0; i < plugins_list.size(); i++) {
-		if (plugins_list[i]->forward_canvas_gui_input(p_canvas_xform, p_event)) {
+		if (plugins_list[i]->forward_canvas_gui_input(p_event)) {
 			discard = true;
 			discard = true;
 		}
 		}
 	}
 	}
@@ -5720,10 +5720,10 @@ bool EditorPluginList::forward_spatial_gui_input(Camera *p_camera, const Ref<Inp
 	return discard;
 	return discard;
 }
 }
 
 
-void EditorPluginList::forward_draw_over_canvas(const Transform2D &p_canvas_xform, Control *p_canvas) {
+void EditorPluginList::forward_draw_over_canvas(Control *p_canvas) {
 
 
 	for (int i = 0; i < plugins_list.size(); i++) {
 	for (int i = 0; i < plugins_list.size(); i++) {
-		plugins_list[i]->forward_draw_over_canvas(p_canvas_xform, p_canvas);
+		plugins_list[i]->forward_draw_over_canvas(p_canvas);
 	}
 	}
 }
 }
 
 

+ 2 - 2
editor/editor_node.h

@@ -812,9 +812,9 @@ public:
 
 
 	void make_visible(bool p_visible);
 	void make_visible(bool p_visible);
 	void edit(Object *p_object);
 	void edit(Object *p_object);
-	bool forward_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event);
+	bool forward_gui_input(const Ref<InputEvent> &p_event);
 	bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event, bool serve_when_force_input_enabled);
 	bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event, bool serve_when_force_input_enabled);
-	void forward_draw_over_canvas(const Transform2D &p_canvas_xform, Control *p_canvas);
+	void forward_draw_over_canvas(Control *p_canvas);
 	void add_plugin(EditorPlugin *p_plugin);
 	void add_plugin(EditorPlugin *p_plugin);
 	void clear();
 	void clear();
 	bool empty();
 	bool empty();

+ 4 - 4
editor/editor_plugin.cpp

@@ -402,18 +402,18 @@ Ref<SpatialEditorGizmo> EditorPlugin::create_spatial_gizmo(Spatial *p_spatial) {
 	return Ref<SpatialEditorGizmo>();
 	return Ref<SpatialEditorGizmo>();
 }
 }
 
 
-bool EditorPlugin::forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) {
+bool EditorPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p_event) {
 
 
 	if (get_script_instance() && get_script_instance()->has_method("forward_canvas_gui_input")) {
 	if (get_script_instance() && get_script_instance()->has_method("forward_canvas_gui_input")) {
-		return get_script_instance()->call("forward_canvas_gui_input", p_canvas_xform, p_event);
+		return get_script_instance()->call("forward_canvas_gui_input", p_event);
 	}
 	}
 	return false;
 	return false;
 }
 }
 
 
-void EditorPlugin::forward_draw_over_canvas(const Transform2D &p_canvas_xform, Control *p_canvas) {
+void EditorPlugin::forward_draw_over_canvas(Control *p_canvas) {
 
 
 	if (get_script_instance() && get_script_instance()->has_method("forward_draw_over_canvas")) {
 	if (get_script_instance() && get_script_instance()->has_method("forward_draw_over_canvas")) {
-		get_script_instance()->call("forward_draw_over_canvas", p_canvas_xform, p_canvas);
+		get_script_instance()->call("forward_draw_over_canvas", p_canvas);
 	}
 	}
 }
 }
 
 

+ 2 - 2
editor/editor_plugin.h

@@ -156,8 +156,8 @@ public:
 	void notify_scene_closed(const String &scene_filepath);
 	void notify_scene_closed(const String &scene_filepath);
 
 
 	virtual Ref<SpatialEditorGizmo> create_spatial_gizmo(Spatial *p_spatial);
 	virtual Ref<SpatialEditorGizmo> create_spatial_gizmo(Spatial *p_spatial);
-	virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event);
-	virtual void forward_draw_over_canvas(const Transform2D &p_canvas_xform, Control *p_canvas);
+	virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event);
+	virtual void forward_draw_over_canvas(Control *p_canvas);
 	virtual bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event);
 	virtual bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event);
 	virtual String get_name() const;
 	virtual String get_name() const;
 	virtual bool has_main_screen() const;
 	virtual bool has_main_screen() const;

+ 5 - 16
editor/plugins/abstract_polygon_2d_editor.cpp

@@ -195,9 +195,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
 		Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform();
 		Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform();
 
 
 		Vector2 gpoint = mb->get_position();
 		Vector2 gpoint = mb->get_position();
-		Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
-		cpoint = canvas_item_editor->snap_point(cpoint);
-		cpoint = _get_node()->get_global_transform().affine_inverse().xform(cpoint);
+		Vector2 cpoint = _get_node()->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position())));
 
 
 		//first check if a point is to be added (segment split)
 		//first check if a point is to be added (segment split)
 		real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
 		real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
@@ -425,15 +423,14 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
 		if (edited_point != -1 && (wip_active || (mm->get_button_mask() & BUTTON_MASK_LEFT))) {
 		if (edited_point != -1 && (wip_active || (mm->get_button_mask() & BUTTON_MASK_LEFT))) {
 
 
 			Vector2 gpoint = mm->get_position();
 			Vector2 gpoint = mm->get_position();
-			Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
-			cpoint = canvas_item_editor->snap_point(cpoint);
-			edited_point_pos = _get_node()->get_global_transform().affine_inverse().xform(cpoint);
+			Vector2 cpoint = _get_node()->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mm->get_position())));
+			edited_point_pos = cpoint;
 
 
 			if (!wip_active) {
 			if (!wip_active) {
 
 
 				Vector<Vector2> vertices = _get_polygon(edited_polygon);
 				Vector<Vector2> vertices = _get_polygon(edited_polygon);
 				ERR_FAIL_INDEX_V(edited_point, vertices.size(), false);
 				ERR_FAIL_INDEX_V(edited_point, vertices.size(), false);
-				vertices[edited_point] = edited_point_pos - _get_offset(edited_polygon);
+				vertices[edited_point] = cpoint - _get_offset(edited_polygon);
 				_set_polygon(edited_polygon, vertices);
 				_set_polygon(edited_polygon, vertices);
 			}
 			}
 
 
@@ -444,8 +441,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
 	return false;
 	return false;
 }
 }
 
 
-void AbstractPolygon2DEditor::_canvas_draw() {
-
+void AbstractPolygon2DEditor::forward_draw_over_canvas(Control *p_canvas) {
 	if (!_get_node())
 	if (!_get_node())
 		return;
 		return;
 
 
@@ -527,9 +523,6 @@ void AbstractPolygon2DEditor::edit(Node *p_polygon) {
 		if (_is_empty())
 		if (_is_empty())
 			_menu_option(MODE_CREATE);
 			_menu_option(MODE_CREATE);
 
 
-		if (!canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw"))
-			canvas_item_editor->get_viewport_control()->connect("draw", this, "_canvas_draw");
-
 		wip.clear();
 		wip.clear();
 		wip_active = false;
 		wip_active = false;
 		edited_point = -1;
 		edited_point = -1;
@@ -539,15 +532,11 @@ void AbstractPolygon2DEditor::edit(Node *p_polygon) {
 	} else {
 	} else {
 
 
 		_set_node(NULL);
 		_set_node(NULL);
-
-		if (canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw"))
-			canvas_item_editor->get_viewport_control()->disconnect("draw", this, "_canvas_draw");
 	}
 	}
 }
 }
 
 
 void AbstractPolygon2DEditor::_bind_methods() {
 void AbstractPolygon2DEditor::_bind_methods() {
 
 
-	ClassDB::bind_method(D_METHOD("_canvas_draw"), &AbstractPolygon2DEditor::_canvas_draw);
 	ClassDB::bind_method(D_METHOD("_node_removed"), &AbstractPolygon2DEditor::_node_removed);
 	ClassDB::bind_method(D_METHOD("_node_removed"), &AbstractPolygon2DEditor::_node_removed);
 	ClassDB::bind_method(D_METHOD("_menu_option"), &AbstractPolygon2DEditor::_menu_option);
 	ClassDB::bind_method(D_METHOD("_menu_option"), &AbstractPolygon2DEditor::_menu_option);
 	ClassDB::bind_method(D_METHOD("_create_resource"), &AbstractPolygon2DEditor::_create_resource);
 	ClassDB::bind_method(D_METHOD("_create_resource"), &AbstractPolygon2DEditor::_create_resource);

+ 4 - 2
editor/plugins/abstract_polygon_2d_editor.h

@@ -75,7 +75,6 @@ protected:
 
 
 	virtual void _menu_option(int p_option);
 	virtual void _menu_option(int p_option);
 	void _wip_close();
 	void _wip_close();
-	void _canvas_draw();
 
 
 	void _notification(int p_what);
 	void _notification(int p_what);
 	void _node_removed(Node *p_node);
 	void _node_removed(Node *p_node);
@@ -103,6 +102,8 @@ protected:
 
 
 public:
 public:
 	bool forward_gui_input(const Ref<InputEvent> &p_event);
 	bool forward_gui_input(const Ref<InputEvent> &p_event);
+	void forward_draw_over_canvas(Control *p_canvas);
+
 	void edit(Node *p_polygon);
 	void edit(Node *p_polygon);
 	AbstractPolygon2DEditor(EditorNode *p_editor, bool p_wip_destructive = true);
 	AbstractPolygon2DEditor(EditorNode *p_editor, bool p_wip_destructive = true);
 };
 };
@@ -116,7 +117,8 @@ class AbstractPolygon2DEditorPlugin : public EditorPlugin {
 	String klass;
 	String klass;
 
 
 public:
 public:
-	virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { return polygon_editor->forward_gui_input(p_event); }
+	virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return polygon_editor->forward_gui_input(p_event); }
+	virtual void forward_draw_over_canvas(Control *p_canvas) { polygon_editor->forward_draw_over_canvas(p_canvas); }
 
 
 	bool has_main_screen() const { return false; }
 	bool has_main_screen() const { return false; }
 	virtual String get_name() const { return klass; }
 	virtual String get_name() const { return klass; }

+ 25 - 18
editor/plugins/canvas_item_editor_plugin.cpp

@@ -1198,14 +1198,23 @@ void CanvasItemEditor::_update_cursor() {
 	viewport->set_default_cursor_shape(c);
 	viewport->set_default_cursor_shape(c);
 }
 }
 
 
-void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event) {
+void CanvasItemEditor::_gui_input_viewport_base(const Ref<InputEvent> &p_event) {
+
+	Ref<InputEventMouseMotion> m = p_event;
+	if (m.is_valid()) {
+		if (!viewport_base->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field()))
+			viewport_base->call_deferred("grab_focus");
+	}
+}
+
+void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) {
 
 
 	{
 	{
 		EditorNode *en = editor;
 		EditorNode *en = editor;
 		EditorPluginList *over_plugin_list = en->get_editor_plugins_over();
 		EditorPluginList *over_plugin_list = en->get_editor_plugins_over();
 
 
 		if (!over_plugin_list->empty()) {
 		if (!over_plugin_list->empty()) {
-			bool discard = over_plugin_list->forward_gui_input(transform, p_event);
+			bool discard = over_plugin_list->forward_gui_input(p_event);
 			if (discard) {
 			if (discard) {
 				accept_event();
 				accept_event();
 				return;
 				return;
@@ -1224,7 +1233,7 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event)
 				_update_scroll(0);
 				_update_scroll(0);
 				viewport->update();
 				viewport->update();
 			} else {
 			} else {
-				_zoom_on_position(zoom * (1 - (0.05 * b->get_factor())), viewport_scrollable->get_transform().affine_inverse().xform(b->get_position()));
+				_zoom_on_position(zoom * (1 - (0.05 * b->get_factor())), b->get_position());
 			}
 			}
 
 
 			return;
 			return;
@@ -1237,7 +1246,7 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event)
 				_update_scroll(0);
 				_update_scroll(0);
 				viewport->update();
 				viewport->update();
 			} else {
 			} else {
-				_zoom_on_position(zoom * ((0.95 + (0.05 * b->get_factor())) / 0.95), viewport_scrollable->get_transform().affine_inverse().xform(b->get_position()));
+				_zoom_on_position(zoom * ((0.95 + (0.05 * b->get_factor())) / 0.95), b->get_position());
 			}
 			}
 
 
 			return;
 			return;
@@ -1320,7 +1329,7 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event)
 		if (b->get_button_index() == BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) {
 		if (b->get_button_index() == BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) {
 			if (b->is_pressed()) {
 			if (b->is_pressed()) {
 				// Set the pivot point
 				// Set the pivot point
-				Point2 mouse_pos = viewport_scrollable->get_transform().affine_inverse().xform(b->get_position());
+				Point2 mouse_pos = b->get_position();
 				mouse_pos = transform.affine_inverse().xform(mouse_pos);
 				mouse_pos = transform.affine_inverse().xform(mouse_pos);
 				mouse_pos = snap_point(mouse_pos, SNAP_DEFAULT, _get_single_item());
 				mouse_pos = snap_point(mouse_pos, SNAP_DEFAULT, _get_single_item());
 				_edit_set_pivot(mouse_pos);
 				_edit_set_pivot(mouse_pos);
@@ -1443,8 +1452,8 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event)
 					E->get().to
 					E->get().to
 				};
 				};
 
 
-				Vector2 p = Geometry::get_closest_point_to_segment_2d(viewport_scrollable->get_transform().affine_inverse().xform(b->get_position()), s);
-				float d = p.distance_to(viewport_scrollable->get_transform().affine_inverse().xform(b->get_position()));
+				Vector2 p = Geometry::get_closest_point_to_segment_2d(b->get_position(), s);
+				float d = p.distance_to(b->get_position());
 				if (d < bone_width && d < closest_dist) {
 				if (d < bone_width && d < closest_dist) {
 					Cbone = E;
 					Cbone = E;
 					closest_dist = d;
 					closest_dist = d;
@@ -1506,7 +1515,7 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event)
 			CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
 			CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
 			ERR_FAIL_COND(!se);
 			ERR_FAIL_COND(!se);
 
 
-			Point2 click = viewport_scrollable->get_transform().affine_inverse().xform(b->get_position());
+			Point2 click = b->get_position();
 
 
 			// Rotation
 			// Rotation
 			if ((b->get_control() && tool == TOOL_SELECT) || tool == TOOL_ROTATE) {
 			if ((b->get_control() && tool == TOOL_SELECT) || tool == TOOL_ROTATE) {
@@ -1561,7 +1570,7 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event)
 		}
 		}
 
 
 		// Multiple selected items
 		// Multiple selected items
-		Point2 click = viewport_scrollable->get_transform().affine_inverse().xform(b->get_position());
+		Point2 click = b->get_position();
 
 
 		if ((b->get_alt() || tool == TOOL_MOVE) && get_item_count()) {
 		if ((b->get_alt() || tool == TOOL_MOVE) && get_item_count()) {
 			// Drag the nodes
 			// Drag the nodes
@@ -1621,12 +1630,9 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event)
 		// Mouse motion event
 		// Mouse motion event
 		_update_cursor();
 		_update_cursor();
 
 
-		if (!viewport_base->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field()))
-			viewport_base->call_deferred("grab_focus");
-
 		if (box_selecting) {
 		if (box_selecting) {
 			// Update box selection
 			// Update box selection
-			box_selecting_to = transform.affine_inverse().xform(viewport_scrollable->get_transform().affine_inverse().xform(m->get_position()));
+			box_selecting_to = transform.affine_inverse().xform(m->get_position());
 			viewport->update();
 			viewport->update();
 			return;
 			return;
 		}
 		}
@@ -1672,7 +1678,7 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event)
 			}
 			}
 
 
 			Vector2 dfrom = drag_from;
 			Vector2 dfrom = drag_from;
-			Vector2 dto = transform.affine_inverse().xform(viewport_scrollable->get_transform().affine_inverse().xform(m->get_position()));
+			Vector2 dto = transform.affine_inverse().xform(m->get_position());
 			if (canvas_item->has_meta("_edit_lock_"))
 			if (canvas_item->has_meta("_edit_lock_"))
 				continue;
 				continue;
 
 
@@ -2681,9 +2687,8 @@ void CanvasItemEditor::_draw_viewport() {
 
 
 	EditorPluginList *over_plugin_list = editor->get_editor_plugins_over();
 	EditorPluginList *over_plugin_list = editor->get_editor_plugins_over();
 	if (!over_plugin_list->empty()) {
 	if (!over_plugin_list->empty()) {
-		over_plugin_list->forward_draw_over_canvas(transform, viewport);
+		over_plugin_list->forward_draw_over_canvas(viewport);
 	}
 	}
-	_draw_focus();
 	_draw_bones();
 	_draw_bones();
 }
 }
 
 
@@ -3694,7 +3699,8 @@ void CanvasItemEditor::_bind_methods() {
 	ClassDB::bind_method("_unhandled_key_input", &CanvasItemEditor::_unhandled_key_input);
 	ClassDB::bind_method("_unhandled_key_input", &CanvasItemEditor::_unhandled_key_input);
 	ClassDB::bind_method("_draw_viewport", &CanvasItemEditor::_draw_viewport);
 	ClassDB::bind_method("_draw_viewport", &CanvasItemEditor::_draw_viewport);
 	ClassDB::bind_method("_draw_viewport_base", &CanvasItemEditor::_draw_viewport_base);
 	ClassDB::bind_method("_draw_viewport_base", &CanvasItemEditor::_draw_viewport_base);
-	ClassDB::bind_method("_viewport_base_gui_input", &CanvasItemEditor::_viewport_base_gui_input);
+	ClassDB::bind_method("_gui_input_viewport", &CanvasItemEditor::_gui_input_viewport);
+	ClassDB::bind_method("_gui_input_viewport_base", &CanvasItemEditor::_gui_input_viewport_base);
 	ClassDB::bind_method("_snap_changed", &CanvasItemEditor::_snap_changed);
 	ClassDB::bind_method("_snap_changed", &CanvasItemEditor::_snap_changed);
 	ClassDB::bind_method(D_METHOD("_selection_result_pressed"), &CanvasItemEditor::_selection_result_pressed);
 	ClassDB::bind_method(D_METHOD("_selection_result_pressed"), &CanvasItemEditor::_selection_result_pressed);
 	ClassDB::bind_method(D_METHOD("_selection_menu_hide"), &CanvasItemEditor::_selection_menu_hide);
 	ClassDB::bind_method(D_METHOD("_selection_menu_hide"), &CanvasItemEditor::_selection_menu_hide);
@@ -3747,7 +3753,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
 	palette_split->add_child(viewport_base);
 	palette_split->add_child(viewport_base);
 	viewport_base->set_clip_contents(true);
 	viewport_base->set_clip_contents(true);
 	viewport_base->connect("draw", this, "_draw_viewport_base");
 	viewport_base->connect("draw", this, "_draw_viewport_base");
-	viewport_base->connect("gui_input", this, "_viewport_base_gui_input");
+	viewport_base->connect("gui_input", this, "_gui_input_viewport_base");
 	viewport_base->set_focus_mode(FOCUS_ALL);
 	viewport_base->set_focus_mode(FOCUS_ALL);
 	viewport_base->set_v_size_flags(SIZE_EXPAND_FILL);
 	viewport_base->set_v_size_flags(SIZE_EXPAND_FILL);
 	viewport_base->set_h_size_flags(SIZE_EXPAND_FILL);
 	viewport_base->set_h_size_flags(SIZE_EXPAND_FILL);
@@ -3771,6 +3777,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
 	viewport->set_anchors_and_margins_preset(Control::PRESET_WIDE);
 	viewport->set_anchors_and_margins_preset(Control::PRESET_WIDE);
 	viewport->set_clip_contents(true);
 	viewport->set_clip_contents(true);
 	viewport->connect("draw", this, "_draw_viewport");
 	viewport->connect("draw", this, "_draw_viewport");
+	viewport->connect("gui_input", this, "_gui_input_viewport");
 
 
 	h_scroll = memnew(HScrollBar);
 	h_scroll = memnew(HScrollBar);
 	viewport->add_child(h_scroll);
 	viewport->add_child(h_scroll);

+ 3 - 2
editor/plugins/canvas_item_editor_plugin.h

@@ -410,10 +410,11 @@ class CanvasItemEditor : public VBoxContainer {
 	void _draw_locks_and_groups(Node *p_node, const Transform2D &p_xform);
 	void _draw_locks_and_groups(Node *p_node, const Transform2D &p_xform);
 
 
 	void _draw_viewport();
 	void _draw_viewport();
-
-	void _viewport_base_gui_input(const Ref<InputEvent> &p_event);
 	void _draw_viewport_base();
 	void _draw_viewport_base();
 
 
+	void _gui_input_viewport(const Ref<InputEvent> &p_event);
+	void _gui_input_viewport_base(const Ref<InputEvent> &p_event);
+
 	void _focus_selection(int p_op);
 	void _focus_selection(int p_op);
 
 
 	void _snap_if_closer(Point2 p_value, Point2 p_target_snap, Point2 &r_current_snap, bool (&r_snapped)[2], real_t rotation = 0.0, float p_radius = 10.0);
 	void _snap_if_closer(Point2 p_value, Point2 p_target_snap, Point2 &r_current_snap, bool (&r_snapped)[2], real_t rotation = 0.0, float p_radius = 10.0);

+ 17 - 27
editor/plugins/collision_polygon_2d_editor_plugin.cpp

@@ -302,7 +302,7 @@ void CollisionShape2DEditor::commit_handle(int idx, Variant &p_org) {
 	undo_redo->commit_action();
 	undo_redo->commit_action();
 }
 }
 
 
-bool CollisionShape2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
+bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_event) {
 
 
 	if (!node) {
 	if (!node) {
 		return false;
 		return false;
@@ -317,17 +317,17 @@ bool CollisionShape2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 	}
 	}
 
 
 	Ref<InputEventMouseButton> mb = p_event;
 	Ref<InputEventMouseButton> mb = p_event;
+	Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
 
 
 	if (mb.is_valid()) {
 	if (mb.is_valid()) {
 
 
-		Transform2D gt = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
-
-		Point2 gpoint(mb->get_position().x, mb->get_position().y);
+		Vector2 gpoint = mb->get_position();
+		Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position())));
 
 
 		if (mb->get_button_index() == BUTTON_LEFT) {
 		if (mb->get_button_index() == BUTTON_LEFT) {
 			if (mb->is_pressed()) {
 			if (mb->is_pressed()) {
 				for (int i = 0; i < handles.size(); i++) {
 				for (int i = 0; i < handles.size(); i++) {
-					if (gt.xform(handles[i]).distance_to(gpoint) < 8) {
+					if (xform.xform(handles[i]).distance_to(gpoint) < 8) {
 						edit_handle = i;
 						edit_handle = i;
 
 
 						break;
 						break;
@@ -368,9 +368,7 @@ bool CollisionShape2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 			return false;
 			return false;
 		}
 		}
 
 
-		Point2 gpoint = mm->get_position();
-		Point2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
-		cpoint = canvas_item_editor->snap_point(cpoint);
+		Vector2 cpoint = canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mm->get_position()));
 		cpoint = node->get_global_transform().affine_inverse().xform(cpoint);
 		cpoint = node->get_global_transform().affine_inverse().xform(cpoint);
 
 
 		set_handle(edit_handle, cpoint);
 		set_handle(edit_handle, cpoint);
@@ -416,7 +414,7 @@ void CollisionShape2DEditor::_get_current_shape_type() {
 	canvas_item_editor->get_viewport_control()->update();
 	canvas_item_editor->get_viewport_control()->update();
 }
 }
 
 
-void CollisionShape2DEditor::_canvas_draw() {
+void CollisionShape2DEditor::forward_draw_over_canvas(Control *p_canvas) {
 
 
 	if (!node) {
 	if (!node) {
 		return;
 		return;
@@ -432,7 +430,6 @@ void CollisionShape2DEditor::_canvas_draw() {
 		return;
 		return;
 	}
 	}
 
 
-	Control *c = canvas_item_editor->get_viewport_control();
 	Transform2D gt = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
 	Transform2D gt = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
 
 
 	Ref<Texture> h = get_icon("EditorHandle", "EditorIcons");
 	Ref<Texture> h = get_icon("EditorHandle", "EditorIcons");
@@ -451,8 +448,8 @@ void CollisionShape2DEditor::_canvas_draw() {
 			handles[0] = Point2(radius, -height);
 			handles[0] = Point2(radius, -height);
 			handles[1] = Point2(0, -(height + radius));
 			handles[1] = Point2(0, -(height + radius));
 
 
-			c->draw_texture(h, gt.xform(handles[0]) - size);
-			c->draw_texture(h, gt.xform(handles[1]) - size);
+			p_canvas->draw_texture(h, gt.xform(handles[0]) - size);
+			p_canvas->draw_texture(h, gt.xform(handles[1]) - size);
 
 
 		} break;
 		} break;
 
 
@@ -462,7 +459,7 @@ void CollisionShape2DEditor::_canvas_draw() {
 			handles.resize(1);
 			handles.resize(1);
 			handles[0] = Point2(shape->get_radius(), 0);
 			handles[0] = Point2(shape->get_radius(), 0);
 
 
-			c->draw_texture(h, gt.xform(handles[0]) - size);
+			p_canvas->draw_texture(h, gt.xform(handles[0]) - size);
 
 
 		} break;
 		} break;
 
 
@@ -481,8 +478,8 @@ void CollisionShape2DEditor::_canvas_draw() {
 			handles[0] = shape->get_normal() * shape->get_d();
 			handles[0] = shape->get_normal() * shape->get_d();
 			handles[1] = shape->get_normal() * (shape->get_d() + 30.0);
 			handles[1] = shape->get_normal() * (shape->get_d() + 30.0);
 
 
-			c->draw_texture(h, gt.xform(handles[0]) - size);
-			c->draw_texture(h, gt.xform(handles[1]) - size);
+			p_canvas->draw_texture(h, gt.xform(handles[0]) - size);
+			p_canvas->draw_texture(h, gt.xform(handles[1]) - size);
 
 
 		} break;
 		} break;
 
 
@@ -492,7 +489,7 @@ void CollisionShape2DEditor::_canvas_draw() {
 			handles.resize(1);
 			handles.resize(1);
 			handles[0] = Point2(0, shape->get_length());
 			handles[0] = Point2(0, shape->get_length());
 
 
-			c->draw_texture(h, gt.xform(handles[0]) - size);
+			p_canvas->draw_texture(h, gt.xform(handles[0]) - size);
 
 
 		} break;
 		} break;
 
 
@@ -504,8 +501,8 @@ void CollisionShape2DEditor::_canvas_draw() {
 			handles[0] = Point2(ext.x, 0);
 			handles[0] = Point2(ext.x, 0);
 			handles[1] = Point2(0, -ext.y);
 			handles[1] = Point2(0, -ext.y);
 
 
-			c->draw_texture(h, gt.xform(handles[0]) - size);
-			c->draw_texture(h, gt.xform(handles[1]) - size);
+			p_canvas->draw_texture(h, gt.xform(handles[0]) - size);
+			p_canvas->draw_texture(h, gt.xform(handles[1]) - size);
 
 
 		} break;
 		} break;
 
 
@@ -516,8 +513,8 @@ void CollisionShape2DEditor::_canvas_draw() {
 			handles[0] = shape->get_a();
 			handles[0] = shape->get_a();
 			handles[1] = shape->get_b();
 			handles[1] = shape->get_b();
 
 
-			c->draw_texture(h, gt.xform(handles[0]) - size);
-			c->draw_texture(h, gt.xform(handles[1]) - size);
+			p_canvas->draw_texture(h, gt.xform(handles[0]) - size);
+			p_canvas->draw_texture(h, gt.xform(handles[1]) - size);
 
 
 		} break;
 		} break;
 	}
 	}
@@ -532,18 +529,12 @@ void CollisionShape2DEditor::edit(Node *p_node) {
 	if (p_node) {
 	if (p_node) {
 		node = Object::cast_to<CollisionShape2D>(p_node);
 		node = Object::cast_to<CollisionShape2D>(p_node);
 
 
-		if (!canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw"))
-			canvas_item_editor->get_viewport_control()->connect("draw", this, "_canvas_draw");
-
 		_get_current_shape_type();
 		_get_current_shape_type();
 
 
 	} else {
 	} else {
 		edit_handle = -1;
 		edit_handle = -1;
 		shape_type = -1;
 		shape_type = -1;
 
 
-		if (canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw"))
-			canvas_item_editor->get_viewport_control()->disconnect("draw", this, "_canvas_draw");
-
 		node = NULL;
 		node = NULL;
 	}
 	}
 
 
@@ -552,7 +543,6 @@ void CollisionShape2DEditor::edit(Node *p_node) {
 
 
 void CollisionShape2DEditor::_bind_methods() {
 void CollisionShape2DEditor::_bind_methods() {
 
 
-	ClassDB::bind_method("_canvas_draw", &CollisionShape2DEditor::_canvas_draw);
 	ClassDB::bind_method("_get_current_shape_type", &CollisionShape2DEditor::_get_current_shape_type);
 	ClassDB::bind_method("_get_current_shape_type", &CollisionShape2DEditor::_get_current_shape_type);
 }
 }
 
 

+ 4 - 3
editor/plugins/collision_shape_2d_editor_plugin.h

@@ -68,13 +68,13 @@ class CollisionShape2DEditor : public Control {
 	void commit_handle(int idx, Variant &p_org);
 	void commit_handle(int idx, Variant &p_org);
 
 
 	void _get_current_shape_type();
 	void _get_current_shape_type();
-	void _canvas_draw();
 
 
 protected:
 protected:
 	static void _bind_methods();
 	static void _bind_methods();
 
 
 public:
 public:
-	bool forward_gui_input(const Ref<InputEvent> &p_event);
+	bool forward_canvas_gui_input(const Ref<InputEvent> &p_event);
+	void forward_draw_over_canvas(Control *p_canvas);
 	void edit(Node *p_node);
 	void edit(Node *p_node);
 
 
 	CollisionShape2DEditor(EditorNode *p_editor);
 	CollisionShape2DEditor(EditorNode *p_editor);
@@ -87,7 +87,8 @@ class CollisionShape2DEditorPlugin : public EditorPlugin {
 	EditorNode *editor;
 	EditorNode *editor;
 
 
 public:
 public:
-	virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { return collision_shape_2d_editor->forward_gui_input(p_event); }
+	virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return collision_shape_2d_editor->forward_canvas_gui_input(p_event); }
+	virtual void forward_draw_over_canvas(Control *p_canvas) { return collision_shape_2d_editor->forward_draw_over_canvas(p_canvas); }
 
 
 	virtual String get_name() const { return "CollisionShape2D"; }
 	virtual String get_name() const { return "CollisionShape2D"; }
 	bool has_main_screen() const { return false; }
 	bool has_main_screen() const { return false; }

+ 10 - 17
editor/plugins/light_occluder_2d_editor_plugin.cpp

@@ -119,9 +119,7 @@ bool LightOccluder2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 		Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
 		Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
 
 
 		Vector2 gpoint = mb->get_position();
 		Vector2 gpoint = mb->get_position();
-		Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
-		cpoint = canvas_item_editor->snap_point(cpoint);
-		cpoint = node->get_global_transform().affine_inverse().xform(cpoint);
+		Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position())));
 
 
 		Vector<Vector2> poly = Variant(node->get_occluder_polygon()->get_polygon());
 		Vector<Vector2> poly = Variant(node->get_occluder_polygon()->get_polygon());
 
 
@@ -319,7 +317,8 @@ bool LightOccluder2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 
 
 	return false;
 	return false;
 }
 }
-void LightOccluder2DEditor::_canvas_draw() {
+
+void LightOccluder2DEditor::forward_draw_over_canvas(Control *p_canvas) {
 
 
 	if (!node || !node->get_occluder_polygon().is_valid())
 	if (!node || !node->get_occluder_polygon().is_valid())
 		return;
 		return;
@@ -368,17 +367,12 @@ void LightOccluder2DEditor::edit(Node *p_collision_polygon) {
 	if (p_collision_polygon) {
 	if (p_collision_polygon) {
 
 
 		node = Object::cast_to<LightOccluder2D>(p_collision_polygon);
 		node = Object::cast_to<LightOccluder2D>(p_collision_polygon);
-		if (!canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw"))
-			canvas_item_editor->get_viewport_control()->connect("draw", this, "_canvas_draw");
 		wip.clear();
 		wip.clear();
 		wip_active = false;
 		wip_active = false;
 		edited_point = -1;
 		edited_point = -1;
 		canvas_item_editor->get_viewport_control()->update();
 		canvas_item_editor->get_viewport_control()->update();
 	} else {
 	} else {
 		node = NULL;
 		node = NULL;
-
-		if (canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw"))
-			canvas_item_editor->get_viewport_control()->disconnect("draw", this, "_canvas_draw");
 	}
 	}
 }
 }
 
 
@@ -395,7 +389,6 @@ void LightOccluder2DEditor::_create_poly() {
 void LightOccluder2DEditor::_bind_methods() {
 void LightOccluder2DEditor::_bind_methods() {
 
 
 	ClassDB::bind_method(D_METHOD("_menu_option"), &LightOccluder2DEditor::_menu_option);
 	ClassDB::bind_method(D_METHOD("_menu_option"), &LightOccluder2DEditor::_menu_option);
-	ClassDB::bind_method(D_METHOD("_canvas_draw"), &LightOccluder2DEditor::_canvas_draw);
 	ClassDB::bind_method(D_METHOD("_node_removed"), &LightOccluder2DEditor::_node_removed);
 	ClassDB::bind_method(D_METHOD("_node_removed"), &LightOccluder2DEditor::_node_removed);
 	ClassDB::bind_method(D_METHOD("_create_poly"), &LightOccluder2DEditor::_create_poly);
 	ClassDB::bind_method(D_METHOD("_create_poly"), &LightOccluder2DEditor::_create_poly);
 }
 }
@@ -430,7 +423,7 @@ LightOccluder2DEditor::LightOccluder2DEditor(EditorNode *p_editor) {
 
 
 void LightOccluder2DEditorPlugin::edit(Object *p_object) {
 void LightOccluder2DEditorPlugin::edit(Object *p_object) {
 
 
-	collision_polygon_editor->edit(Object::cast_to<Node>(p_object));
+	light_occluder_editor->edit(Object::cast_to<Node>(p_object));
 }
 }
 
 
 bool LightOccluder2DEditorPlugin::handles(Object *p_object) const {
 bool LightOccluder2DEditorPlugin::handles(Object *p_object) const {
@@ -441,21 +434,21 @@ bool LightOccluder2DEditorPlugin::handles(Object *p_object) const {
 void LightOccluder2DEditorPlugin::make_visible(bool p_visible) {
 void LightOccluder2DEditorPlugin::make_visible(bool p_visible) {
 
 
 	if (p_visible) {
 	if (p_visible) {
-		collision_polygon_editor->show();
+		light_occluder_editor->show();
 	} else {
 	} else {
 
 
-		collision_polygon_editor->hide();
-		collision_polygon_editor->edit(NULL);
+		light_occluder_editor->hide();
+		light_occluder_editor->edit(NULL);
 	}
 	}
 }
 }
 
 
 LightOccluder2DEditorPlugin::LightOccluder2DEditorPlugin(EditorNode *p_node) {
 LightOccluder2DEditorPlugin::LightOccluder2DEditorPlugin(EditorNode *p_node) {
 
 
 	editor = p_node;
 	editor = p_node;
-	collision_polygon_editor = memnew(LightOccluder2DEditor(p_node));
-	CanvasItemEditor::get_singleton()->add_control_to_menu_panel(collision_polygon_editor);
+	light_occluder_editor = memnew(LightOccluder2DEditor(p_node));
+	CanvasItemEditor::get_singleton()->add_control_to_menu_panel(light_occluder_editor);
 
 
-	collision_polygon_editor->hide();
+	light_occluder_editor->hide();
 }
 }
 
 
 LightOccluder2DEditorPlugin::~LightOccluder2DEditorPlugin() {
 LightOccluder2DEditorPlugin::~LightOccluder2DEditorPlugin() {

+ 4 - 3
editor/plugins/light_occluder_2d_editor_plugin.h

@@ -72,7 +72,6 @@ class LightOccluder2DEditor : public HBoxContainer {
 	ConfirmationDialog *create_poly;
 	ConfirmationDialog *create_poly;
 
 
 	void _wip_close(bool p_closed);
 	void _wip_close(bool p_closed);
-	void _canvas_draw();
 	void _menu_option(int p_option);
 	void _menu_option(int p_option);
 	void _create_poly();
 	void _create_poly();
 
 
@@ -83,6 +82,7 @@ protected:
 
 
 public:
 public:
 	Vector2 snap_point(const Vector2 &p_point) const;
 	Vector2 snap_point(const Vector2 &p_point) const;
+	void forward_draw_over_canvas(Control *p_canvas);
 	bool forward_gui_input(const Ref<InputEvent> &p_event);
 	bool forward_gui_input(const Ref<InputEvent> &p_event);
 	void edit(Node *p_collision_polygon);
 	void edit(Node *p_collision_polygon);
 	LightOccluder2DEditor(EditorNode *p_editor);
 	LightOccluder2DEditor(EditorNode *p_editor);
@@ -92,11 +92,12 @@ class LightOccluder2DEditorPlugin : public EditorPlugin {
 
 
 	GDCLASS(LightOccluder2DEditorPlugin, EditorPlugin);
 	GDCLASS(LightOccluder2DEditorPlugin, EditorPlugin);
 
 
-	LightOccluder2DEditor *collision_polygon_editor;
+	LightOccluder2DEditor *light_occluder_editor;
 	EditorNode *editor;
 	EditorNode *editor;
 
 
 public:
 public:
-	virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { return collision_polygon_editor->forward_gui_input(p_event); }
+	virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return light_occluder_editor->forward_gui_input(p_event); }
+	virtual void forward_draw_over_canvas(Control *p_canvas) { return light_occluder_editor->forward_draw_over_canvas(p_canvas); }
 
 
 	virtual String get_name() const { return "LightOccluder2D"; }
 	virtual String get_name() const { return "LightOccluder2D"; }
 	bool has_main_screen() const { return false; }
 	bool has_main_screen() const { return false; }

+ 7 - 17
editor/plugins/line_2d_editor_plugin.cpp

@@ -54,16 +54,10 @@ void Line2DEditor::_notification(int p_what) {
 	}
 	}
 }
 }
 
 
-Vector2 Line2DEditor::mouse_to_local_pos(Vector2 gpos, bool alt) {
-	Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
-	return !alt ? canvas_item_editor->snap_point(xform.affine_inverse().xform(gpos)) : node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpos)));
-}
-
-int Line2DEditor::get_point_index_at(Vector2 gpos) {
+int Line2DEditor::get_point_index_at(const Transform2D &xform, Vector2 gpos) {
 	ERR_FAIL_COND_V(node == 0, -1);
 	ERR_FAIL_COND_V(node == 0, -1);
 
 
 	real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
 	real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
-	Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
 
 
 	for (int i = 0; i < node->get_point_count(); ++i) {
 	for (int i = 0; i < node->get_point_count(); ++i) {
 		Point2 p = xform.xform(node->get_point_position(i));
 		Point2 p = xform.xform(node->get_point_position(i));
@@ -75,7 +69,7 @@ int Line2DEditor::get_point_index_at(Vector2 gpos) {
 	return -1;
 	return -1;
 }
 }
 
 
-bool Line2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
+bool Line2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_event) {
 
 
 	if (!node)
 	if (!node)
 		return false;
 		return false;
@@ -88,10 +82,10 @@ bool Line2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 	if (mb.is_valid()) {
 	if (mb.is_valid()) {
 
 
 		Vector2 gpoint = mb->get_position();
 		Vector2 gpoint = mb->get_position();
-		Vector2 cpoint = mouse_to_local_pos(gpoint, mb->get_alt());
+		Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position())));
 
 
 		if (mb->is_pressed() && _dragging == false) {
 		if (mb->is_pressed() && _dragging == false) {
-			int i = get_point_index_at(gpoint);
+			int i = get_point_index_at(canvas_item_editor->get_canvas_transform() * node->get_global_transform(), gpoint);
 			if (i != -1) {
 			if (i != -1) {
 				if (mb->get_button_index() == BUTTON_LEFT && !mb->get_shift() && mode == MODE_EDIT) {
 				if (mb->get_button_index() == BUTTON_LEFT && !mb->get_shift() && mode == MODE_EDIT) {
 					_dragging = true;
 					_dragging = true;
@@ -146,7 +140,8 @@ bool Line2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 	if (mm.is_valid()) {
 	if (mm.is_valid()) {
 
 
 		if (_dragging) {
 		if (_dragging) {
-			Vector2 cpoint = mouse_to_local_pos(mm->get_position(), mm->get_alt());
+			Vector2 gpoint = mm->get_position();
+			Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mm->get_position())));
 			node->set_point_position(action_point, cpoint);
 			node->set_point_position(action_point, cpoint);
 			canvas_item_editor->get_viewport_control()->update();
 			canvas_item_editor->get_viewport_control()->update();
 			return true;
 			return true;
@@ -156,7 +151,7 @@ bool Line2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 	return false;
 	return false;
 }
 }
 
 
-void Line2DEditor::_canvas_draw() {
+void Line2DEditor::forward_draw_over_canvas(Control *p_canvas) {
 
 
 	if (!node)
 	if (!node)
 		return;
 		return;
@@ -190,13 +185,9 @@ void Line2DEditor::edit(Node *p_line2d) {
 
 
 	if (p_line2d) {
 	if (p_line2d) {
 		node = Object::cast_to<Line2D>(p_line2d);
 		node = Object::cast_to<Line2D>(p_line2d);
-		if (!canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw"))
-			canvas_item_editor->get_viewport_control()->connect("draw", this, "_canvas_draw");
 		if (!node->is_connected("visibility_changed", this, "_node_visibility_changed"))
 		if (!node->is_connected("visibility_changed", this, "_node_visibility_changed"))
 			node->connect("visibility_changed", this, "_node_visibility_changed");
 			node->connect("visibility_changed", this, "_node_visibility_changed");
 	} else {
 	} else {
-		if (canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw"))
-			canvas_item_editor->get_viewport_control()->disconnect("draw", this, "_canvas_draw");
 		// node may have been deleted at this point
 		// node may have been deleted at this point
 		if (node && node->is_connected("visibility_changed", this, "_node_visibility_changed"))
 		if (node && node->is_connected("visibility_changed", this, "_node_visibility_changed"))
 			node->disconnect("visibility_changed", this, "_node_visibility_changed");
 			node->disconnect("visibility_changed", this, "_node_visibility_changed");
@@ -205,7 +196,6 @@ void Line2DEditor::edit(Node *p_line2d) {
 }
 }
 
 
 void Line2DEditor::_bind_methods() {
 void Line2DEditor::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_canvas_draw"), &Line2DEditor::_canvas_draw);
 	ClassDB::bind_method(D_METHOD("_node_visibility_changed"), &Line2DEditor::_node_visibility_changed);
 	ClassDB::bind_method(D_METHOD("_node_visibility_changed"), &Line2DEditor::_node_visibility_changed);
 	ClassDB::bind_method(D_METHOD("_mode_selected"), &Line2DEditor::_mode_selected);
 	ClassDB::bind_method(D_METHOD("_mode_selected"), &Line2DEditor::_mode_selected);
 }
 }

+ 15 - 22
editor/plugins/line_2d_editor_plugin.h

@@ -40,27 +40,11 @@ class CanvasItemEditor;
 
 
 class Line2DEditor : public HBoxContainer {
 class Line2DEditor : public HBoxContainer {
 	GDCLASS(Line2DEditor, HBoxContainer)
 	GDCLASS(Line2DEditor, HBoxContainer)
-
-public:
-	bool forward_gui_input(const Ref<InputEvent> &p_event);
-	void edit(Node *p_line2d);
-	Line2DEditor(EditorNode *p_editor);
-
-protected:
-	void _node_removed(Node *p_node);
-	void _notification(int p_what);
-
-	Vector2 mouse_to_local_pos(Vector2 mpos);
-
-	static void _bind_methods();
-
 private:
 private:
 	void _mode_selected(int p_mode);
 	void _mode_selected(int p_mode);
-	void _canvas_draw();
 	void _node_visibility_changed();
 	void _node_visibility_changed();
 
 
-	int get_point_index_at(Vector2 gpos);
-	Vector2 mouse_to_local_pos(Vector2 gpos, bool alt);
+	int get_point_index_at(const Transform2D &xform, Vector2 gpos);
 
 
 	UndoRedo *undo_redo;
 	UndoRedo *undo_redo;
 
 
@@ -86,17 +70,26 @@ private:
 	int action_point;
 	int action_point;
 	Point2 moving_from;
 	Point2 moving_from;
 	Point2 moving_screen_from;
 	Point2 moving_screen_from;
+
+protected:
+	void _node_removed(Node *p_node);
+	void _notification(int p_what);
+
+	static void _bind_methods();
+
+public:
+	bool forward_canvas_gui_input(const Ref<InputEvent> &p_event);
+	void forward_draw_over_canvas(Control *p_canvas);
+	void edit(Node *p_line2d);
+	Line2DEditor(EditorNode *p_editor);
 };
 };
 
 
 class Line2DEditorPlugin : public EditorPlugin {
 class Line2DEditorPlugin : public EditorPlugin {
 	GDCLASS(Line2DEditorPlugin, EditorPlugin)
 	GDCLASS(Line2DEditorPlugin, EditorPlugin)
 
 
 public:
 public:
-	virtual bool forward_canvas_gui_input(
-			const Transform2D &p_canvas_xform,
-			const Ref<InputEvent> &p_event) {
-		return line2d_editor->forward_gui_input(p_event);
-	}
+	virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return line2d_editor->forward_canvas_gui_input(p_event); }
+	virtual void forward_draw_over_canvas(Control *p_canvas) { return line2d_editor->forward_draw_over_canvas(p_canvas); }
 
 
 	virtual String get_name() const { return "Line2D"; }
 	virtual String get_name() const { return "Line2D"; }
 	bool has_main_screen() const { return false; }
 	bool has_main_screen() const { return false; }

+ 4 - 15
editor/plugins/navigation_polygon_editor_plugin.cpp

@@ -76,10 +76,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 		Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
 		Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
 
 
 		Vector2 gpoint = mb->get_position();
 		Vector2 gpoint = mb->get_position();
-		Vector2 cpoint =
-				!mb->get_alt() ?
-						canvas_item_editor->snap_point(xform.affine_inverse().xform(gpoint)) :
-						node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint)));
+		Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position())));
 
 
 		real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
 		real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
 
 
@@ -239,10 +236,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 			// Handle point/control movement.
 			// Handle point/control movement.
 			Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
 			Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
 			Vector2 gpoint = mm->get_position();
 			Vector2 gpoint = mm->get_position();
-			Vector2 cpoint =
-					!mm->get_alt() ?
-							canvas_item_editor->snap_point(xform.affine_inverse().xform(gpoint)) :
-							node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint)));
+			Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mm->get_position())));
 
 
 			Ref<Curve2D> curve = node->get_curve();
 			Ref<Curve2D> curve = node->get_curve();
 
 
@@ -274,7 +268,8 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 
 
 	return false;
 	return false;
 }
 }
-void Path2DEditor::_canvas_draw() {
+
+void Path2DEditor::forward_draw_over_canvas(Control *p_canvas) {
 
 
 	if (!node)
 	if (!node)
 		return;
 		return;
@@ -329,16 +324,11 @@ void Path2DEditor::edit(Node *p_path2d) {
 	if (p_path2d) {
 	if (p_path2d) {
 
 
 		node = Object::cast_to<Path2D>(p_path2d);
 		node = Object::cast_to<Path2D>(p_path2d);
-		if (!canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw"))
-			canvas_item_editor->get_viewport_control()->connect("draw", this, "_canvas_draw");
 		if (!node->is_connected("visibility_changed", this, "_node_visibility_changed"))
 		if (!node->is_connected("visibility_changed", this, "_node_visibility_changed"))
 			node->connect("visibility_changed", this, "_node_visibility_changed");
 			node->connect("visibility_changed", this, "_node_visibility_changed");
 
 
 	} else {
 	} else {
 
 
-		if (canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw"))
-			canvas_item_editor->get_viewport_control()->disconnect("draw", this, "_canvas_draw");
-
 		// node may have been deleted at this point
 		// node may have been deleted at this point
 		if (node && node->is_connected("visibility_changed", this, "_node_visibility_changed"))
 		if (node && node->is_connected("visibility_changed", this, "_node_visibility_changed"))
 			node->disconnect("visibility_changed", this, "_node_visibility_changed");
 			node->disconnect("visibility_changed", this, "_node_visibility_changed");
@@ -349,7 +339,6 @@ void Path2DEditor::edit(Node *p_path2d) {
 void Path2DEditor::_bind_methods() {
 void Path2DEditor::_bind_methods() {
 
 
 	//ClassDB::bind_method(D_METHOD("_menu_option"),&Path2DEditor::_menu_option);
 	//ClassDB::bind_method(D_METHOD("_menu_option"),&Path2DEditor::_menu_option);
-	ClassDB::bind_method(D_METHOD("_canvas_draw"), &Path2DEditor::_canvas_draw);
 	ClassDB::bind_method(D_METHOD("_node_visibility_changed"), &Path2DEditor::_node_visibility_changed);
 	ClassDB::bind_method(D_METHOD("_node_visibility_changed"), &Path2DEditor::_node_visibility_changed);
 	ClassDB::bind_method(D_METHOD("_mode_selected"), &Path2DEditor::_mode_selected);
 	ClassDB::bind_method(D_METHOD("_mode_selected"), &Path2DEditor::_mode_selected);
 }
 }

+ 3 - 2
editor/plugins/path_2d_editor_plugin.h

@@ -84,7 +84,6 @@ class Path2DEditor : public HBoxContainer {
 
 
 	void _mode_selected(int p_mode);
 	void _mode_selected(int p_mode);
 
 
-	void _canvas_draw();
 	void _node_visibility_changed();
 	void _node_visibility_changed();
 	friend class Path2DEditorPlugin;
 	friend class Path2DEditorPlugin;
 
 
@@ -95,6 +94,7 @@ protected:
 
 
 public:
 public:
 	bool forward_gui_input(const Ref<InputEvent> &p_event);
 	bool forward_gui_input(const Ref<InputEvent> &p_event);
+	void forward_draw_over_canvas(Control *p_canvas);
 	void edit(Node *p_path2d);
 	void edit(Node *p_path2d);
 	Path2DEditor(EditorNode *p_editor);
 	Path2DEditor(EditorNode *p_editor);
 };
 };
@@ -107,7 +107,8 @@ class Path2DEditorPlugin : public EditorPlugin {
 	EditorNode *editor;
 	EditorNode *editor;
 
 
 public:
 public:
-	virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { return path2d_editor->forward_gui_input(p_event); }
+	virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return path2d_editor->forward_gui_input(p_event); }
+	virtual void forward_draw_over_canvas(Control *p_canvas) { return path2d_editor->forward_draw_over_canvas(p_canvas); }
 
 
 	virtual String get_name() const { return "Path2D"; }
 	virtual String get_name() const { return "Path2D"; }
 	bool has_main_screen() const { return false; }
 	bool has_main_screen() const { return false; }

+ 2 - 7
editor/plugins/polygon_2d_editor_plugin.cpp

@@ -229,7 +229,7 @@ struct _PaletteEntry {
 		return name < p_rhs.name;
 		return name < p_rhs.name;
 	}
 	}
 };
 };
-}
+} // namespace
 
 
 void TileMapEditor::_update_palette() {
 void TileMapEditor::_update_palette() {
 
 
@@ -1152,7 +1152,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 	return false;
 	return false;
 }
 }
 
 
-void TileMapEditor::_canvas_draw() {
+void TileMapEditor::forward_draw_over_canvas(Control *p_canvas) {
 
 
 	if (!node)
 	if (!node)
 		return;
 		return;
@@ -1379,8 +1379,6 @@ void TileMapEditor::edit(Node *p_tile_map) {
 	if (p_tile_map) {
 	if (p_tile_map) {
 
 
 		node = Object::cast_to<TileMap>(p_tile_map);
 		node = Object::cast_to<TileMap>(p_tile_map);
-		if (!canvas_item_editor->is_connected("draw", this, "_canvas_draw"))
-			canvas_item_editor->connect("draw", this, "_canvas_draw");
 		if (!canvas_item_editor->is_connected("mouse_entered", this, "_canvas_mouse_enter"))
 		if (!canvas_item_editor->is_connected("mouse_entered", this, "_canvas_mouse_enter"))
 			canvas_item_editor->connect("mouse_entered", this, "_canvas_mouse_enter");
 			canvas_item_editor->connect("mouse_entered", this, "_canvas_mouse_enter");
 		if (!canvas_item_editor->is_connected("mouse_exited", this, "_canvas_mouse_exit"))
 		if (!canvas_item_editor->is_connected("mouse_exited", this, "_canvas_mouse_exit"))
@@ -1391,8 +1389,6 @@ void TileMapEditor::edit(Node *p_tile_map) {
 	} else {
 	} else {
 		node = NULL;
 		node = NULL;
 
 
-		if (canvas_item_editor->is_connected("draw", this, "_canvas_draw"))
-			canvas_item_editor->disconnect("draw", this, "_canvas_draw");
 		if (canvas_item_editor->is_connected("mouse_entered", this, "_canvas_mouse_enter"))
 		if (canvas_item_editor->is_connected("mouse_entered", this, "_canvas_mouse_enter"))
 			canvas_item_editor->disconnect("mouse_entered", this, "_canvas_mouse_enter");
 			canvas_item_editor->disconnect("mouse_entered", this, "_canvas_mouse_enter");
 		if (canvas_item_editor->is_connected("mouse_exited", this, "_canvas_mouse_exit"))
 		if (canvas_item_editor->is_connected("mouse_exited", this, "_canvas_mouse_exit"))
@@ -1428,7 +1424,6 @@ void TileMapEditor::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("_text_changed"), &TileMapEditor::_text_changed);
 	ClassDB::bind_method(D_METHOD("_text_changed"), &TileMapEditor::_text_changed);
 	ClassDB::bind_method(D_METHOD("_sbox_input"), &TileMapEditor::_sbox_input);
 	ClassDB::bind_method(D_METHOD("_sbox_input"), &TileMapEditor::_sbox_input);
 	ClassDB::bind_method(D_METHOD("_menu_option"), &TileMapEditor::_menu_option);
 	ClassDB::bind_method(D_METHOD("_menu_option"), &TileMapEditor::_menu_option);
-	ClassDB::bind_method(D_METHOD("_canvas_draw"), &TileMapEditor::_canvas_draw);
 	ClassDB::bind_method(D_METHOD("_canvas_mouse_enter"), &TileMapEditor::_canvas_mouse_enter);
 	ClassDB::bind_method(D_METHOD("_canvas_mouse_enter"), &TileMapEditor::_canvas_mouse_enter);
 	ClassDB::bind_method(D_METHOD("_canvas_mouse_exit"), &TileMapEditor::_canvas_mouse_exit);
 	ClassDB::bind_method(D_METHOD("_canvas_mouse_exit"), &TileMapEditor::_canvas_mouse_exit);
 	ClassDB::bind_method(D_METHOD("_tileset_settings_changed"), &TileMapEditor::_tileset_settings_changed);
 	ClassDB::bind_method(D_METHOD("_tileset_settings_changed"), &TileMapEditor::_tileset_settings_changed);

+ 3 - 1
editor/plugins/tile_map_editor_plugin.h

@@ -163,7 +163,6 @@ class TileMapEditor : public VBoxContainer {
 	void _text_changed(const String &p_text);
 	void _text_changed(const String &p_text);
 	void _sbox_input(const Ref<InputEvent> &p_ie);
 	void _sbox_input(const Ref<InputEvent> &p_ie);
 	void _update_palette();
 	void _update_palette();
-	void _canvas_draw();
 	void _menu_option(int p_option);
 	void _menu_option(int p_option);
 
 
 	void _set_cell(const Point2i &p_pos, int p_value, bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false, bool p_with_undo = false);
 	void _set_cell(const Point2i &p_pos, int p_value, bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false, bool p_with_undo = false);
@@ -183,6 +182,8 @@ public:
 	HBoxContainer *get_toolbar() const { return toolbar; }
 	HBoxContainer *get_toolbar() const { return toolbar; }
 
 
 	bool forward_gui_input(const Ref<InputEvent> &p_event);
 	bool forward_gui_input(const Ref<InputEvent> &p_event);
+	void forward_draw_over_canvas(Control *p_canvas);
+
 	void edit(Node *p_tile_map);
 	void edit(Node *p_tile_map);
 
 
 	TileMapEditor(EditorNode *p_editor);
 	TileMapEditor(EditorNode *p_editor);
@@ -197,6 +198,7 @@ class TileMapEditorPlugin : public EditorPlugin {
 
 
 public:
 public:
 	virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { return tile_map_editor->forward_gui_input(p_event); }
 	virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { return tile_map_editor->forward_gui_input(p_event); }
+	virtual void forward_draw_over_canvas(Control *p_canvas) { tile_map_editor->forward_draw_over_canvas(p_canvas); }
 
 
 	virtual String get_name() const { return "TileMap"; }
 	virtual String get_name() const { return "TileMap"; }
 	bool has_main_screen() const { return false; }
 	bool has_main_screen() const { return false; }