|
@@ -214,28 +214,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) {
|
|
|
} break;
|
|
} break;
|
|
|
|
|
|
|
|
case MENU_OPTION_CREATE_NAVMESH: {
|
|
case MENU_OPTION_CREATE_NAVMESH: {
|
|
|
- Ref<NavigationMesh> nmesh = memnew(NavigationMesh);
|
|
|
|
|
-
|
|
|
|
|
- if (nmesh.is_null()) {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- nmesh->create_from_mesh(mesh);
|
|
|
|
|
- NavigationRegion3D *nmi = memnew(NavigationRegion3D);
|
|
|
|
|
- nmi->set_navigation_mesh(nmesh);
|
|
|
|
|
-
|
|
|
|
|
- Node *owner = get_tree()->get_edited_scene_root();
|
|
|
|
|
-
|
|
|
|
|
- EditorUndoRedoManager *ur = EditorUndoRedoManager::get_singleton();
|
|
|
|
|
- ur->create_action(TTR("Create Navigation Mesh"));
|
|
|
|
|
-
|
|
|
|
|
- ur->add_do_method(node, "add_child", nmi, true);
|
|
|
|
|
- ur->add_do_method(nmi, "set_owner", owner);
|
|
|
|
|
- ur->add_do_method(Node3DEditor::get_singleton(), SceneStringName(_request_gizmo), nmi);
|
|
|
|
|
-
|
|
|
|
|
- ur->add_do_reference(nmi);
|
|
|
|
|
- ur->add_undo_method(node, "remove_child", nmi);
|
|
|
|
|
- ur->commit_action();
|
|
|
|
|
|
|
+ navigation_mesh_dialog->popup_centered(Vector2(200, 90));
|
|
|
} break;
|
|
} break;
|
|
|
|
|
|
|
|
case MENU_OPTION_CREATE_OUTLINE_MESH: {
|
|
case MENU_OPTION_CREATE_OUTLINE_MESH: {
|
|
@@ -472,6 +451,36 @@ void MeshInstance3DEditor::_debug_uv_draw() {
|
|
|
debug_uv->draw_multiline(uv_lines, get_theme_color(SNAME("mono_color"), EditorStringName(Editor)) * Color(1, 1, 1, 0.5));
|
|
debug_uv->draw_multiline(uv_lines, get_theme_color(SNAME("mono_color"), EditorStringName(Editor)) * Color(1, 1, 1, 0.5));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void MeshInstance3DEditor::_create_navigation_mesh() {
|
|
|
|
|
+ Ref<Mesh> mesh = node->get_mesh();
|
|
|
|
|
+ if (mesh.is_null()) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Ref<NavigationMesh> nmesh = memnew(NavigationMesh);
|
|
|
|
|
+
|
|
|
|
|
+ if (nmesh.is_null()) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ nmesh->create_from_mesh(mesh);
|
|
|
|
|
+ NavigationRegion3D *nmi = memnew(NavigationRegion3D);
|
|
|
|
|
+ nmi->set_navigation_mesh(nmesh);
|
|
|
|
|
+
|
|
|
|
|
+ Node *owner = get_tree()->get_edited_scene_root();
|
|
|
|
|
+
|
|
|
|
|
+ EditorUndoRedoManager *ur = EditorUndoRedoManager::get_singleton();
|
|
|
|
|
+ ur->create_action(TTR("Create Navigation Mesh"));
|
|
|
|
|
+
|
|
|
|
|
+ ur->add_do_method(node, "add_child", nmi, true);
|
|
|
|
|
+ ur->add_do_method(nmi, "set_owner", owner);
|
|
|
|
|
+ ur->add_do_method(Node3DEditor::get_singleton(), SceneStringName(_request_gizmo), nmi);
|
|
|
|
|
+
|
|
|
|
|
+ ur->add_do_reference(nmi);
|
|
|
|
|
+ ur->add_undo_method(node, "remove_child", nmi);
|
|
|
|
|
+ ur->commit_action();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void MeshInstance3DEditor::_create_outline_mesh() {
|
|
void MeshInstance3DEditor::_create_outline_mesh() {
|
|
|
Ref<Mesh> mesh = node->get_mesh();
|
|
Ref<Mesh> mesh = node->get_mesh();
|
|
|
if (mesh.is_null()) {
|
|
if (mesh.is_null()) {
|
|
@@ -608,6 +617,20 @@ MeshInstance3DEditor::MeshInstance3DEditor() {
|
|
|
debug_uv->set_custom_minimum_size(Size2(600, 600) * EDSCALE);
|
|
debug_uv->set_custom_minimum_size(Size2(600, 600) * EDSCALE);
|
|
|
debug_uv->connect(SceneStringName(draw), callable_mp(this, &MeshInstance3DEditor::_debug_uv_draw));
|
|
debug_uv->connect(SceneStringName(draw), callable_mp(this, &MeshInstance3DEditor::_debug_uv_draw));
|
|
|
debug_uv_dialog->add_child(debug_uv);
|
|
debug_uv_dialog->add_child(debug_uv);
|
|
|
|
|
+
|
|
|
|
|
+ navigation_mesh_dialog = memnew(ConfirmationDialog);
|
|
|
|
|
+ navigation_mesh_dialog->set_title(TTR("Create NavigationMesh"));
|
|
|
|
|
+ navigation_mesh_dialog->set_ok_button_text(TTR("Create"));
|
|
|
|
|
+
|
|
|
|
|
+ VBoxContainer *navigation_mesh_dialog_vbc = memnew(VBoxContainer);
|
|
|
|
|
+ navigation_mesh_dialog->add_child(navigation_mesh_dialog_vbc);
|
|
|
|
|
+
|
|
|
|
|
+ Label *navigation_mesh_l = memnew(Label);
|
|
|
|
|
+ navigation_mesh_l->set_text(TTR("Before converting a rendering mesh to a navigation mesh, please verify:\n\n- The mesh is two-dimensional.\n- The mesh has no surface overlap.\n- The mesh has no self-intersection.\n- The mesh surfaces have indices.\n\nIf the mesh does not fulfill these requirements, the pathfinding will be broken."));
|
|
|
|
|
+ navigation_mesh_dialog_vbc->add_child(navigation_mesh_l);
|
|
|
|
|
+
|
|
|
|
|
+ add_child(navigation_mesh_dialog);
|
|
|
|
|
+ navigation_mesh_dialog->connect("confirmed", callable_mp(this, &MeshInstance3DEditor::_create_navigation_mesh));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void MeshInstance3DEditorPlugin::edit(Object *p_object) {
|
|
void MeshInstance3DEditorPlugin::edit(Object *p_object) {
|