| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  abstract_polygon_2d_editor.cpp                                       */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							|  |  |  | /*                      https://godotengine.org                          */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2022-01-03 21:27:34 +01:00
										 |  |  | /* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */ | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | #include "abstract_polygon_2d_editor.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "canvas_item_editor_plugin.h"
 | 
					
						
							| 
									
										
										
										
											2020-05-25 20:20:45 +03:00
										 |  |  | #include "core/math/geometry_2d.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | #include "core/os/keyboard.h"
 | 
					
						
							| 
									
										
										
										
											2022-02-12 02:46:22 +01:00
										 |  |  | #include "editor/editor_node.h"
 | 
					
						
							| 
									
										
										
										
											2019-12-24 15:17:23 +08:00
										 |  |  | #include "editor/editor_scale.h"
 | 
					
						
							| 
									
										
										
										
											2022-07-31 21:14:15 +03:00
										 |  |  | #include "editor/editor_settings.h"
 | 
					
						
							| 
									
										
										
										
											2022-03-25 18:06:46 +01:00
										 |  |  | #include "editor/editor_undo_redo_manager.h"
 | 
					
						
							| 
									
										
										
										
											2022-07-31 21:14:15 +03:00
										 |  |  | #include "scene/gui/separator.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | bool AbstractPolygon2DEditor::Vertex::operator==(const AbstractPolygon2DEditor::Vertex &p_vertex) const { | 
					
						
							|  |  |  | 	return polygon == p_vertex.polygon && vertex == p_vertex.vertex; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AbstractPolygon2DEditor::Vertex::operator!=(const AbstractPolygon2DEditor::Vertex &p_vertex) const { | 
					
						
							|  |  |  | 	return !(*this == p_vertex); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AbstractPolygon2DEditor::Vertex::valid() const { | 
					
						
							|  |  |  | 	return vertex >= 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | bool AbstractPolygon2DEditor::_is_empty() const { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (!_get_node()) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		return true; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	const int n = _get_polygon_count(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (int i = 0; i < n; i++) { | 
					
						
							|  |  |  | 		Vector<Vector2> vertices = _get_polygon(i); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		if (vertices.size() != 0) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 			return false; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | bool AbstractPolygon2DEditor::_is_line() const { | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-24 02:38:26 -02:00
										 |  |  | bool AbstractPolygon2DEditor::_has_uv() const { | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | int AbstractPolygon2DEditor::_get_polygon_count() const { | 
					
						
							|  |  |  | 	return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Variant AbstractPolygon2DEditor::_get_polygon(int p_idx) const { | 
					
						
							|  |  |  | 	return _get_node()->get("polygon"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditor::_set_polygon(int p_idx, const Variant &p_polygon) const { | 
					
						
							|  |  |  | 	_get_node()->set("polygon", p_polygon); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditor::_action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon) { | 
					
						
							|  |  |  | 	Node2D *node = _get_node(); | 
					
						
							|  |  |  | 	undo_redo->add_do_method(node, "set_polygon", p_polygon); | 
					
						
							|  |  |  | 	undo_redo->add_undo_method(node, "set_polygon", p_previous); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Vector2 AbstractPolygon2DEditor::_get_offset(int p_idx) const { | 
					
						
							|  |  |  | 	return Vector2(0, 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditor::_commit_action() { | 
					
						
							| 
									
										
										
										
											2018-10-18 14:06:57 +02:00
										 |  |  | 	undo_redo->add_do_method(canvas_item_editor, "update_viewport"); | 
					
						
							|  |  |  | 	undo_redo->add_undo_method(canvas_item_editor, "update_viewport"); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	undo_redo->commit_action(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditor::_action_add_polygon(const Variant &p_polygon) { | 
					
						
							|  |  |  | 	_action_set_polygon(0, p_polygon); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditor::_action_remove_polygon(int p_idx) { | 
					
						
							| 
									
										
										
										
											2020-02-17 18:06:54 -03:00
										 |  |  | 	_action_set_polygon(p_idx, _get_polygon(p_idx), Vector<Vector2>()); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditor::_action_set_polygon(int p_idx, const Variant &p_polygon) { | 
					
						
							|  |  |  | 	_action_set_polygon(p_idx, _get_polygon(p_idx), p_polygon); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AbstractPolygon2DEditor::_has_resource() const { | 
					
						
							|  |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditor::_create_resource() { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditor::_menu_option(int p_option) { | 
					
						
							|  |  |  | 	switch (p_option) { | 
					
						
							|  |  |  | 		case MODE_CREATE: { | 
					
						
							|  |  |  | 			mode = MODE_CREATE; | 
					
						
							|  |  |  | 			button_create->set_pressed(true); | 
					
						
							|  |  |  | 			button_edit->set_pressed(false); | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 			button_delete->set_pressed(false); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 		case MODE_EDIT: { | 
					
						
							| 
									
										
										
										
											2017-12-04 13:44:30 +01:00
										 |  |  | 			_wip_close(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 			mode = MODE_EDIT; | 
					
						
							|  |  |  | 			button_create->set_pressed(false); | 
					
						
							|  |  |  | 			button_edit->set_pressed(true); | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 			button_delete->set_pressed(false); | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case MODE_DELETE: { | 
					
						
							| 
									
										
										
										
											2017-12-04 13:44:30 +01:00
										 |  |  | 			_wip_close(); | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 			mode = MODE_DELETE; | 
					
						
							|  |  |  | 			button_create->set_pressed(false); | 
					
						
							|  |  |  | 			button_edit->set_pressed(false); | 
					
						
							|  |  |  | 			button_delete->set_pressed(true); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditor::_notification(int p_what) { | 
					
						
							|  |  |  | 	switch (p_what) { | 
					
						
							| 
									
										
										
										
											2022-08-29 11:04:31 +02:00
										 |  |  | 		case NOTIFICATION_ENTER_TREE: | 
					
						
							| 
									
										
										
										
											2022-01-28 20:21:50 +03:00
										 |  |  | 		case NOTIFICATION_THEME_CHANGED: { | 
					
						
							|  |  |  | 			button_create->set_icon(get_theme_icon(SNAME("CurveCreate"), SNAME("EditorIcons"))); | 
					
						
							|  |  |  | 			button_edit->set_icon(get_theme_icon(SNAME("CurveEdit"), SNAME("EditorIcons"))); | 
					
						
							|  |  |  | 			button_delete->set_icon(get_theme_icon(SNAME("CurveDelete"), SNAME("EditorIcons"))); | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2022-02-15 21:44:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		case NOTIFICATION_READY: { | 
					
						
							| 
									
										
										
										
											2019-02-16 20:13:02 -02:00
										 |  |  | 			disable_polygon_editing(false, String()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 			button_edit->set_pressed(true); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-21 18:28:45 +01:00
										 |  |  | 			get_tree()->connect("node_removed", callable_mp(this, &AbstractPolygon2DEditor::_node_removed)); | 
					
						
							|  |  |  | 			create_resource->connect("confirmed", callable_mp(this, &AbstractPolygon2DEditor::_create_resource)); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditor::_node_removed(Node *p_node) { | 
					
						
							|  |  |  | 	if (p_node == _get_node()) { | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 		edit(nullptr); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		hide(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 14:06:57 +02:00
										 |  |  | 		canvas_item_editor->update_viewport(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | void AbstractPolygon2DEditor::_wip_changed() { | 
					
						
							|  |  |  | 	if (wip_active && _is_line()) { | 
					
						
							|  |  |  | 		_set_polygon(0, wip); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-13 18:50:54 -03:00
										 |  |  | void AbstractPolygon2DEditor::_wip_cancel() { | 
					
						
							|  |  |  | 	wip.clear(); | 
					
						
							|  |  |  | 	wip_active = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	edited_point = PosVertex(); | 
					
						
							|  |  |  | 	hover_point = Vertex(); | 
					
						
							|  |  |  | 	selected_point = Vertex(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	canvas_item_editor->update_viewport(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | void AbstractPolygon2DEditor::_wip_close() { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (!wip_active) { | 
					
						
							| 
									
										
										
										
											2017-12-04 13:44:30 +01:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-12-04 13:44:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 	if (_is_line()) { | 
					
						
							|  |  |  | 		_set_polygon(0, wip); | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 	} else if (wip.size() >= (_is_line() ? 2 : 3)) { | 
					
						
							| 
									
										
										
										
											2018-11-24 02:38:26 -02:00
										 |  |  | 		undo_redo->create_action(TTR("Create Polygon")); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		_action_add_polygon(wip); | 
					
						
							| 
									
										
										
										
											2018-11-24 02:38:26 -02:00
										 |  |  | 		if (_has_uv()) { | 
					
						
							| 
									
										
										
										
											2020-02-17 18:06:54 -03:00
										 |  |  | 			undo_redo->add_do_method(_get_node(), "set_uv", Vector<Vector2>()); | 
					
						
							| 
									
										
										
										
											2018-11-24 02:38:26 -02:00
										 |  |  | 			undo_redo->add_undo_method(_get_node(), "set_uv", _get_node()->get("uv")); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		_commit_action(); | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 	mode = MODE_EDIT; | 
					
						
							|  |  |  | 	button_edit->set_pressed(true); | 
					
						
							|  |  |  | 	button_create->set_pressed(false); | 
					
						
							|  |  |  | 	button_delete->set_pressed(false); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	wip.clear(); | 
					
						
							|  |  |  | 	wip_active = false; | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	edited_point = PosVertex(); | 
					
						
							|  |  |  | 	hover_point = Vertex(); | 
					
						
							|  |  |  | 	selected_point = Vertex(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-16 16:46:09 -02:00
										 |  |  | void AbstractPolygon2DEditor::disable_polygon_editing(bool p_disable, String p_reason) { | 
					
						
							|  |  |  | 	_polygon_editing_enabled = !p_disable; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	button_create->set_disabled(p_disable); | 
					
						
							|  |  |  | 	button_edit->set_disabled(p_disable); | 
					
						
							|  |  |  | 	button_delete->set_disabled(p_disable); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (p_disable) { | 
					
						
							| 
									
										
										
										
											2022-08-25 12:42:17 +02:00
										 |  |  | 		button_create->set_tooltip_text(p_reason); | 
					
						
							|  |  |  | 		button_edit->set_tooltip_text(p_reason); | 
					
						
							|  |  |  | 		button_delete->set_tooltip_text(p_reason); | 
					
						
							| 
									
										
										
										
											2019-02-16 16:46:09 -02:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2022-08-25 12:42:17 +02:00
										 |  |  | 		button_create->set_tooltip_text(TTR("Create points.")); | 
					
						
							|  |  |  | 		button_edit->set_tooltip_text(TTR("Edit points.\nLMB: Move Point\nRMB: Erase Point")); | 
					
						
							|  |  |  | 		button_delete->set_tooltip_text(TTR("Erase points.")); | 
					
						
							| 
									
										
										
										
											2019-02-16 16:46:09 -02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (!_get_node() || !_polygon_editing_enabled) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-11 20:10:57 +01:00
										 |  |  | 	if (!_get_node()->is_visible_in_tree()) { | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	Ref<InputEventMouseButton> mb = p_event; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!_has_resource()) { | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 		if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 			create_resource->set_text(String("No polygon resource on this node.\nCreate and assign one?")); | 
					
						
							| 
									
										
										
										
											2020-03-06 14:00:16 -03:00
										 |  |  | 			create_resource->popup_centered(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 		return (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-19 14:26:04 +02:00
										 |  |  | 	CanvasItemEditor::Tool tool = CanvasItemEditor::get_singleton()->get_current_tool(); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (tool != CanvasItemEditor::TOOL_SELECT) { | 
					
						
							| 
									
										
										
										
											2018-09-19 14:26:04 +02:00
										 |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-09-19 14:26:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	if (mb.is_valid()) { | 
					
						
							|  |  |  | 		Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Vector2 gpoint = mb->get_position(); | 
					
						
							| 
									
										
										
										
											2021-08-14 14:01:57 +05:45
										 |  |  | 		Vector2 cpoint = _get_node()->to_local(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position()))); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 		if (mode == MODE_EDIT || (_is_line() && mode == MODE_CREATE)) { | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 			if (mb->get_button_index() == MouseButton::LEFT) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 				if (mb->is_pressed()) { | 
					
						
							| 
									
										
										
										
											2021-04-24 14:33:50 -06:00
										 |  |  | 					if (mb->is_ctrl_pressed() || mb->is_shift_pressed() || mb->is_alt_pressed()) { | 
					
						
							| 
									
										
										
										
											2018-09-19 14:26:04 +02:00
										 |  |  | 						return false; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 					const PosVertex insert = closest_edge_point(gpoint); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 					if (insert.valid()) { | 
					
						
							|  |  |  | 						Vector<Vector2> vertices = _get_polygon(insert.polygon); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 						if (vertices.size() < (_is_line() ? 2 : 3)) { | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 							vertices.push_back(cpoint); | 
					
						
							| 
									
										
										
										
											2018-11-24 02:38:26 -02:00
										 |  |  | 							undo_redo->create_action(TTR("Edit Polygon")); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 							selected_point = Vertex(insert.polygon, vertices.size()); | 
					
						
							|  |  |  | 							_action_set_polygon(insert.polygon, vertices); | 
					
						
							|  |  |  | 							_commit_action(); | 
					
						
							|  |  |  | 							return true; | 
					
						
							|  |  |  | 						} else { | 
					
						
							|  |  |  | 							edited_point = PosVertex(insert.polygon, insert.vertex + 1, xform.affine_inverse().xform(insert.pos)); | 
					
						
							| 
									
										
										
										
											2022-02-10 15:21:17 +05:45
										 |  |  | 							vertices.insert(edited_point.vertex, edited_point.pos); | 
					
						
							| 
									
										
										
										
											2022-08-07 15:10:28 +02:00
										 |  |  | 							pre_move_edit = vertices; | 
					
						
							| 
									
										
										
										
											2020-09-04 13:22:20 +01:00
										 |  |  | 							selected_point = Vertex(edited_point.polygon, edited_point.vertex); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 							edge_point = PosVertex(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 							undo_redo->create_action(TTR("Insert Point")); | 
					
						
							| 
									
										
										
										
											2022-02-10 15:21:17 +05:45
										 |  |  | 							_action_set_polygon(insert.polygon, vertices); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 							_commit_action(); | 
					
						
							|  |  |  | 							return true; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						//look for points to move
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 						const PosVertex closest = closest_point(gpoint); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 						if (closest.valid()) { | 
					
						
							|  |  |  | 							pre_move_edit = _get_polygon(closest.polygon); | 
					
						
							|  |  |  | 							edited_point = PosVertex(closest, xform.affine_inverse().xform(closest.pos)); | 
					
						
							|  |  |  | 							selected_point = closest; | 
					
						
							|  |  |  | 							edge_point = PosVertex(); | 
					
						
							| 
									
										
										
										
											2018-10-18 14:06:57 +02:00
										 |  |  | 							canvas_item_editor->update_viewport(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 							return true; | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 						} else { | 
					
						
							|  |  |  | 							selected_point = Vertex(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 					if (edited_point.valid()) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 						//apply
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 						Vector<Vector2> vertices = _get_polygon(edited_point.polygon); | 
					
						
							|  |  |  | 						ERR_FAIL_INDEX_V(edited_point.vertex, vertices.size(), false); | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 						vertices.write[edited_point.vertex] = edited_point.pos - _get_offset(edited_point.polygon); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-24 02:38:26 -02:00
										 |  |  | 						undo_redo->create_action(TTR("Edit Polygon")); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 						_action_set_polygon(edited_point.polygon, pre_move_edit, vertices); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 						_commit_action(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 						edited_point = PosVertex(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 						return true; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 			} else if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed() && !edited_point.valid()) { | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 				const PosVertex closest = closest_point(gpoint); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 				if (closest.valid()) { | 
					
						
							|  |  |  | 					remove_point(closest); | 
					
						
							|  |  |  | 					return true; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} else if (mode == MODE_DELETE) { | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 			if (mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) { | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 				const PosVertex closest = closest_point(gpoint); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 				if (closest.valid()) { | 
					
						
							|  |  |  | 					remove_point(closest); | 
					
						
							|  |  |  | 					return true; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (mode == MODE_CREATE) { | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 			if (mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) { | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 				if (_is_line()) { | 
					
						
							|  |  |  | 					// for lines, we don't have a wip mode, and we can undo each single add point.
 | 
					
						
							|  |  |  | 					Vector<Vector2> vertices = _get_polygon(0); | 
					
						
							|  |  |  | 					vertices.push_back(cpoint); | 
					
						
							|  |  |  | 					undo_redo->create_action(TTR("Insert Point")); | 
					
						
							|  |  |  | 					_action_set_polygon(0, vertices); | 
					
						
							|  |  |  | 					_commit_action(); | 
					
						
							|  |  |  | 					return true; | 
					
						
							|  |  |  | 				} else if (!wip_active) { | 
					
						
							|  |  |  | 					wip.clear(); | 
					
						
							|  |  |  | 					wip.push_back(cpoint); | 
					
						
							|  |  |  | 					wip_active = true; | 
					
						
							|  |  |  | 					_wip_changed(); | 
					
						
							|  |  |  | 					edited_point = PosVertex(-1, 1, cpoint); | 
					
						
							| 
									
										
										
										
											2018-10-18 14:06:57 +02:00
										 |  |  | 					canvas_item_editor->update_viewport(); | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 					hover_point = Vertex(); | 
					
						
							|  |  |  | 					selected_point = Vertex(0); | 
					
						
							|  |  |  | 					edge_point = PosVertex(); | 
					
						
							|  |  |  | 					return true; | 
					
						
							|  |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2021-08-23 17:59:19 +02:00
										 |  |  | 					const real_t grab_threshold = EDITOR_GET("editors/polygon_editor/point_grab_radius"); | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-25 18:28:44 +08:00
										 |  |  | 					if (!_is_line() && wip.size() > 1 && xform.xform(wip[0]).distance_to(xform.xform(cpoint)) < grab_threshold) { | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 						//wip closed
 | 
					
						
							|  |  |  | 						_wip_close(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						return true; | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						//add wip point
 | 
					
						
							|  |  |  | 						wip.push_back(cpoint); | 
					
						
							|  |  |  | 						_wip_changed(); | 
					
						
							|  |  |  | 						edited_point = PosVertex(-1, wip.size(), cpoint); | 
					
						
							|  |  |  | 						selected_point = Vertex(wip.size() - 1); | 
					
						
							| 
									
										
										
										
											2018-10-18 14:06:57 +02:00
										 |  |  | 						canvas_item_editor->update_viewport(); | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 						return true; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 			} else if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed() && wip_active) { | 
					
						
							| 
									
										
										
										
											2018-11-13 18:50:54 -03:00
										 |  |  | 				_wip_cancel(); | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 	Ref<InputEventMouseMotion> mm = p_event; | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 	if (mm.is_valid()) { | 
					
						
							|  |  |  | 		Vector2 gpoint = mm->get_position(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 		if (edited_point.valid() && (wip_active || (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE)) { | 
					
						
							| 
									
										
										
										
											2021-08-14 14:01:57 +05:45
										 |  |  | 			Vector2 cpoint = _get_node()->to_local(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint))); | 
					
						
							| 
									
										
										
										
											2019-04-15 15:01:29 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			//Move the point in a single axis. Should only work when editing a polygon and while holding shift.
 | 
					
						
							| 
									
										
										
										
											2021-04-24 14:33:50 -06:00
										 |  |  | 			if (mode == MODE_EDIT && mm->is_shift_pressed()) { | 
					
						
							| 
									
										
										
										
											2019-04-15 15:01:29 -03:00
										 |  |  | 				Vector2 old_point = pre_move_edit.get(selected_point.vertex); | 
					
						
							|  |  |  | 				if (ABS(cpoint.x - old_point.x) > ABS(cpoint.y - old_point.y)) { | 
					
						
							|  |  |  | 					cpoint.y = old_point.y; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					cpoint.x = old_point.x; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 			edited_point = PosVertex(edited_point, cpoint); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 			if (!wip_active) { | 
					
						
							|  |  |  | 				Vector<Vector2> vertices = _get_polygon(edited_point.polygon); | 
					
						
							|  |  |  | 				ERR_FAIL_INDEX_V(edited_point.vertex, vertices.size(), false); | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 				vertices.write[edited_point.vertex] = cpoint - _get_offset(edited_point.polygon); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 				_set_polygon(edited_point.polygon, vertices); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 14:06:57 +02:00
										 |  |  | 			canvas_item_editor->update_viewport(); | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 		} else if (mode == MODE_EDIT || (_is_line() && mode == MODE_CREATE)) { | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 			const PosVertex onEdgeVertex = closest_edge_point(gpoint); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 			if (onEdgeVertex.valid()) { | 
					
						
							|  |  |  | 				hover_point = Vertex(); | 
					
						
							|  |  |  | 				edge_point = onEdgeVertex; | 
					
						
							| 
									
										
										
										
											2018-10-18 14:06:57 +02:00
										 |  |  | 				canvas_item_editor->update_viewport(); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 			} else { | 
					
						
							|  |  |  | 				if (edge_point.valid()) { | 
					
						
							|  |  |  | 					edge_point = PosVertex(); | 
					
						
							| 
									
										
										
										
											2018-10-18 14:06:57 +02:00
										 |  |  | 					canvas_item_editor->update_viewport(); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				const PosVertex new_hover_point = closest_point(gpoint); | 
					
						
							|  |  |  | 				if (hover_point != new_hover_point) { | 
					
						
							|  |  |  | 					hover_point = new_hover_point; | 
					
						
							| 
									
										
										
										
											2018-10-18 14:06:57 +02:00
										 |  |  | 					canvas_item_editor->update_viewport(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 	Ref<InputEventKey> k = p_event; | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 	if (k.is_valid() && k->is_pressed()) { | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 		if (k->get_keycode() == Key::KEY_DELETE || k->get_keycode() == Key::BACKSPACE) { | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 			if (wip_active && selected_point.polygon == -1) { | 
					
						
							|  |  |  | 				if (wip.size() > selected_point.vertex) { | 
					
						
							| 
									
										
										
										
											2021-07-03 16:17:03 -06:00
										 |  |  | 					wip.remove_at(selected_point.vertex); | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 					_wip_changed(); | 
					
						
							|  |  |  | 					selected_point = wip.size() - 1; | 
					
						
							| 
									
										
										
										
											2018-10-18 14:06:57 +02:00
										 |  |  | 					canvas_item_editor->update_viewport(); | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 					return true; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				const Vertex active_point = get_active_point(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (active_point.valid()) { | 
					
						
							|  |  |  | 					remove_point(active_point); | 
					
						
							|  |  |  | 					return true; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 		} else if (wip_active && k->get_keycode() == Key::ENTER) { | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 			_wip_close(); | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 		} else if (wip_active && k->get_keycode() == Key::ESCAPE) { | 
					
						
							| 
									
										
										
										
											2018-11-13 18:50:54 -03:00
										 |  |  | 			_wip_cancel(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 20:00:07 +02:00
										 |  |  | void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (!_get_node()) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-11 20:10:57 +01:00
										 |  |  | 	if (!_get_node()->is_visible_in_tree()) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform(); | 
					
						
							| 
									
										
										
										
											2019-08-18 22:18:57 +02:00
										 |  |  | 	// All polygon points are sharp, so use the sharp handle icon
 | 
					
						
							| 
									
										
										
										
											2021-07-17 18:22:52 -03:00
										 |  |  | 	const Ref<Texture2D> handle = get_theme_icon(SNAME("EditorPathSharpHandle"), SNAME("EditorIcons")); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	const Vertex active_point = get_active_point(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	const int n_polygons = _get_polygon_count(); | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 	const bool is_closed = !_is_line(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for (int j = -1; j < n_polygons; j++) { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		if (wip_active && wip_destructive && j != -1) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-17 18:06:54 -03:00
										 |  |  | 		Vector<Vector2> points; | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		Vector2 offset; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 		if (wip_active && j == edited_point.polygon) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 			points = Variant(wip); | 
					
						
							|  |  |  | 			offset = Vector2(0, 0); | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 			if (j == -1) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 				continue; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 			points = _get_polygon(j); | 
					
						
							|  |  |  | 			offset = _get_offset(j); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-23 17:59:19 +02:00
										 |  |  | 		if (!wip_active && j == edited_point.polygon && EDITOR_GET("editors/polygon_editor/show_previous_outline")) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 			const Color col = Color(0.5, 0.5, 0.5); // FIXME polygon->get_outline_color();
 | 
					
						
							|  |  |  | 			const int n = pre_move_edit.size(); | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 			for (int i = 0; i < n - (is_closed ? 0 : 1); i++) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 				Vector2 p, p2; | 
					
						
							|  |  |  | 				p = pre_move_edit[i] + offset; | 
					
						
							|  |  |  | 				p2 = pre_move_edit[(i + 1) % n] + offset; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Vector2 point = xform.xform(p); | 
					
						
							|  |  |  | 				Vector2 next_point = xform.xform(p2); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-24 22:24:07 -03:00
										 |  |  | 				p_overlay->draw_line(point, next_point, col, Math::round(2 * EDSCALE)); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		const int n_points = points.size(); | 
					
						
							|  |  |  | 		const Color col = Color(1, 0.3, 0.1, 0.8); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for (int i = 0; i < n_points; i++) { | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 			const Vertex vertex(j, i); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 			const Vector2 p = (vertex == edited_point) ? edited_point.pos : (points[i] + offset); | 
					
						
							|  |  |  | 			const Vector2 point = xform.xform(p); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 			if (is_closed || i < n_points - 1) { | 
					
						
							|  |  |  | 				Vector2 p2; | 
					
						
							|  |  |  | 				if (j == edited_point.polygon && | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 						((wip_active && i == n_points - 1) || (((i + 1) % n_points) == edited_point.vertex))) { | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 					p2 = edited_point.pos; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 					p2 = points[(i + 1) % n_points] + offset; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				const Vector2 next_point = xform.xform(p2); | 
					
						
							| 
									
										
										
										
											2019-06-24 22:24:07 -03:00
										 |  |  | 				p_overlay->draw_line(point, next_point, col, Math::round(2 * EDSCALE)); | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-11-12 09:46:37 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for (int i = 0; i < n_points; i++) { | 
					
						
							|  |  |  | 			const Vertex vertex(j, i); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			const Vector2 p = (vertex == edited_point) ? edited_point.pos : (points[i] + offset); | 
					
						
							|  |  |  | 			const Vector2 point = xform.xform(p); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-27 14:01:34 +01:00
										 |  |  | 			const Color modulate = vertex == active_point ? Color(0.5, 1, 2) : Color(1, 1, 1); | 
					
						
							| 
									
										
										
										
											2018-09-18 20:00:07 +02:00
										 |  |  | 			p_overlay->draw_texture(handle, point - handle->get_size() * 0.5, modulate); | 
					
						
							| 
									
										
										
										
											2019-03-11 10:42:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			if (vertex == hover_point) { | 
					
						
							| 
									
										
										
										
											2021-07-17 18:22:52 -03:00
										 |  |  | 				Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); | 
					
						
							|  |  |  | 				int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); | 
					
						
							| 
									
										
										
										
											2019-03-11 10:42:55 +01:00
										 |  |  | 				String num = String::num(vertex.vertex); | 
					
						
							| 
									
										
										
										
											2022-05-09 12:47:10 +03:00
										 |  |  | 				Size2 num_size = font->get_string_size(num, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size); | 
					
						
							| 
									
										
										
										
											2021-11-24 20:58:47 -06:00
										 |  |  | 				p_overlay->draw_string(font, point - num_size * 0.5, num, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, Color(1.0, 1.0, 1.0, 0.5)); | 
					
						
							| 
									
										
										
										
											2019-03-11 10:42:55 +01:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (edge_point.valid()) { | 
					
						
							| 
									
										
										
										
											2021-07-17 18:22:52 -03:00
										 |  |  | 		Ref<Texture2D> add_handle = get_theme_icon(SNAME("EditorHandleAdd"), SNAME("EditorIcons")); | 
					
						
							| 
									
										
										
										
											2018-09-18 20:00:07 +02:00
										 |  |  | 		p_overlay->draw_texture(add_handle, edge_point.pos - add_handle->get_size() * 0.5); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditor::edit(Node *p_polygon) { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (!canvas_item_editor) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 		canvas_item_editor = CanvasItemEditor::get_singleton(); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (p_polygon) { | 
					
						
							|  |  |  | 		_set_node(p_polygon); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-24 02:38:26 -02:00
										 |  |  | 		// Enable the pencil tool if the polygon is empty.
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		if (_is_empty()) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 			_menu_option(MODE_CREATE); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2018-11-24 02:38:26 -02:00
										 |  |  | 			_menu_option(MODE_EDIT); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		wip.clear(); | 
					
						
							|  |  |  | 		wip_active = false; | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 		edited_point = PosVertex(); | 
					
						
							|  |  |  | 		hover_point = Vertex(); | 
					
						
							|  |  |  | 		selected_point = Vertex(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 		_set_node(nullptr); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-03-12 17:22:46 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	canvas_item_editor->update_viewport(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditor::_bind_methods() { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | void AbstractPolygon2DEditor::remove_point(const Vertex &p_vertex) { | 
					
						
							| 
									
										
										
										
											2020-02-17 18:06:54 -03:00
										 |  |  | 	Vector<Vector2> vertices = _get_polygon(p_vertex.polygon); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 	if (vertices.size() > (_is_line() ? 2 : 3)) { | 
					
						
							| 
									
										
										
										
											2021-07-03 16:17:03 -06:00
										 |  |  | 		vertices.remove_at(p_vertex.vertex); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-24 02:38:26 -02:00
										 |  |  | 		undo_redo->create_action(TTR("Edit Polygon (Remove Point)")); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 		_action_set_polygon(p_vertex.polygon, vertices); | 
					
						
							|  |  |  | 		_commit_action(); | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2018-11-24 02:38:26 -02:00
										 |  |  | 		undo_redo->create_action(TTR("Remove Polygon And Point")); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 		_action_remove_polygon(p_vertex.polygon); | 
					
						
							|  |  |  | 		_commit_action(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (_is_empty()) { | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 		_menu_option(MODE_CREATE); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	hover_point = Vertex(); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (selected_point == p_vertex) { | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 		selected_point = Vertex(); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AbstractPolygon2DEditor::Vertex AbstractPolygon2DEditor::get_active_point() const { | 
					
						
							|  |  |  | 	return hover_point.valid() ? hover_point : selected_point; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_point(const Vector2 &p_pos) const { | 
					
						
							| 
									
										
										
										
											2021-08-23 17:59:19 +02:00
										 |  |  | 	const real_t grab_threshold = EDITOR_GET("editors/polygon_editor/point_grab_radius"); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	const int n_polygons = _get_polygon_count(); | 
					
						
							|  |  |  | 	const Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	PosVertex closest; | 
					
						
							|  |  |  | 	real_t closest_dist = 1e10; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (int j = 0; j < n_polygons; j++) { | 
					
						
							| 
									
										
										
										
											2020-02-17 18:06:54 -03:00
										 |  |  | 		Vector<Vector2> points = _get_polygon(j); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 		const Vector2 offset = _get_offset(j); | 
					
						
							|  |  |  | 		const int n_points = points.size(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for (int i = 0; i < n_points; i++) { | 
					
						
							|  |  |  | 			Vector2 cp = xform.xform(points[i] + offset); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			real_t d = cp.distance_to(p_pos); | 
					
						
							|  |  |  | 			if (d < closest_dist && d < grab_threshold) { | 
					
						
							|  |  |  | 				closest_dist = d; | 
					
						
							|  |  |  | 				closest = PosVertex(j, i, cp); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return closest; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_edge_point(const Vector2 &p_pos) const { | 
					
						
							| 
									
										
										
										
											2021-08-23 17:59:19 +02:00
										 |  |  | 	const real_t grab_threshold = EDITOR_GET("editors/polygon_editor/point_grab_radius"); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 	const real_t eps = grab_threshold * 2; | 
					
						
							|  |  |  | 	const real_t eps2 = eps * eps; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const int n_polygons = _get_polygon_count(); | 
					
						
							|  |  |  | 	const Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	PosVertex closest; | 
					
						
							|  |  |  | 	real_t closest_dist = 1e10; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (int j = 0; j < n_polygons; j++) { | 
					
						
							| 
									
										
										
										
											2020-02-17 18:06:54 -03:00
										 |  |  | 		Vector<Vector2> points = _get_polygon(j); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 		const Vector2 offset = _get_offset(j); | 
					
						
							|  |  |  | 		const int n_points = points.size(); | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 		const int n_segments = n_points - (_is_line() ? 1 : 0); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-27 23:14:46 +01:00
										 |  |  | 		for (int i = 0; i < n_segments; i++) { | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 			Vector2 segment[2] = { xform.xform(points[i] + offset), | 
					
						
							|  |  |  | 				xform.xform(points[(i + 1) % n_points] + offset) }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-25 20:20:45 +03:00
										 |  |  | 			Vector2 cp = Geometry2D::get_closest_point_to_segment(p_pos, segment); | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 			if (cp.distance_squared_to(segment[0]) < eps2 || cp.distance_squared_to(segment[1]) < eps2) { | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 				continue; //not valid to reuse point
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			real_t d = cp.distance_to(p_pos); | 
					
						
							|  |  |  | 			if (d < closest_dist && d < grab_threshold) { | 
					
						
							|  |  |  | 				closest_dist = d; | 
					
						
							|  |  |  | 				closest = PosVertex(j, i, cp); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return closest; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-27 10:36:51 +01:00
										 |  |  | AbstractPolygon2DEditor::AbstractPolygon2DEditor(bool p_wip_destructive) { | 
					
						
							| 
									
										
										
										
											2019-06-26 15:08:25 +02:00
										 |  |  | 	undo_redo = EditorNode::get_undo_redo(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 	edited_point = PosVertex(); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	wip_destructive = p_wip_destructive; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 12:40:13 +02:00
										 |  |  | 	hover_point = Vertex(); | 
					
						
							|  |  |  | 	selected_point = Vertex(); | 
					
						
							|  |  |  | 	edge_point = PosVertex(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	add_child(memnew(VSeparator)); | 
					
						
							| 
									
										
										
										
											2020-06-19 20:49:04 +02:00
										 |  |  | 	button_create = memnew(Button); | 
					
						
							|  |  |  | 	button_create->set_flat(true); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	add_child(button_create); | 
					
						
							| 
									
										
										
										
											2022-07-28 22:56:41 +02:00
										 |  |  | 	button_create->connect("pressed", callable_mp(this, &AbstractPolygon2DEditor::_menu_option).bind(MODE_CREATE)); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	button_create->set_toggle_mode(true); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-19 20:49:04 +02:00
										 |  |  | 	button_edit = memnew(Button); | 
					
						
							|  |  |  | 	button_edit->set_flat(true); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	add_child(button_edit); | 
					
						
							| 
									
										
										
										
											2022-07-28 22:56:41 +02:00
										 |  |  | 	button_edit->connect("pressed", callable_mp(this, &AbstractPolygon2DEditor::_menu_option).bind(MODE_EDIT)); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	button_edit->set_toggle_mode(true); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-19 20:49:04 +02:00
										 |  |  | 	button_delete = memnew(Button); | 
					
						
							|  |  |  | 	button_delete->set_flat(true); | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 	add_child(button_delete); | 
					
						
							| 
									
										
										
										
											2022-07-28 22:56:41 +02:00
										 |  |  | 	button_delete->connect("pressed", callable_mp(this, &AbstractPolygon2DEditor::_menu_option).bind(MODE_DELETE)); | 
					
						
							| 
									
										
										
										
											2017-11-04 14:46:49 +01:00
										 |  |  | 	button_delete->set_toggle_mode(true); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	create_resource = memnew(ConfirmationDialog); | 
					
						
							|  |  |  | 	add_child(create_resource); | 
					
						
							| 
									
										
										
										
											2022-07-07 19:31:19 -05:00
										 |  |  | 	create_resource->set_ok_button_text(TTR("Create")); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditorPlugin::edit(Object *p_object) { | 
					
						
							|  |  |  | 	polygon_editor->edit(Object::cast_to<Node>(p_object)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AbstractPolygon2DEditorPlugin::handles(Object *p_object) const { | 
					
						
							|  |  |  | 	return p_object->is_class(klass); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AbstractPolygon2DEditorPlugin::make_visible(bool p_visible) { | 
					
						
							|  |  |  | 	if (p_visible) { | 
					
						
							|  |  |  | 		polygon_editor->show(); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		polygon_editor->hide(); | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 		polygon_editor->edit(nullptr); | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-27 10:36:51 +01:00
										 |  |  | AbstractPolygon2DEditorPlugin::AbstractPolygon2DEditorPlugin(AbstractPolygon2DEditor *p_polygon_editor, String p_class) : | 
					
						
							| 
									
										
										
										
											2018-12-08 15:07:33 -05:00
										 |  |  | 		polygon_editor(p_polygon_editor), | 
					
						
							|  |  |  | 		klass(p_class) { | 
					
						
							| 
									
										
										
										
											2017-09-06 18:41:14 +02:00
										 |  |  | 	CanvasItemEditor::get_singleton()->add_control_to_menu_panel(polygon_editor); | 
					
						
							|  |  |  | 	polygon_editor->hide(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AbstractPolygon2DEditorPlugin::~AbstractPolygon2DEditorPlugin() { | 
					
						
							|  |  |  | } |