From ac723b3e44855e67f31fa8a69fd8a90f828d526d Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Sat, 7 Oct 2023 02:18:55 +0200 Subject: [PATCH] Enable UV2 on primitive meshes when using the MeshInstance3D context menu This makes it easier to discover the UV2 generation functionality on primitive meshes. --- .../mesh_instance_3d_editor_plugin.cpp | 85 ++++++++++--------- 1 file changed, 47 insertions(+), 38 deletions(-) diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.cpp b/editor/plugins/mesh_instance_3d_editor_plugin.cpp index 8d112446a397..eec375cbea87 100644 --- a/editor/plugins/mesh_instance_3d_editor_plugin.cpp +++ b/editor/plugins/mesh_instance_3d_editor_plugin.cpp @@ -44,6 +44,7 @@ #include "scene/gui/spin_box.h" #include "scene/resources/concave_polygon_shape_3d.h" #include "scene/resources/convex_polygon_shape_3d.h" +#include "scene/resources/primitive_meshes.h" #include "scene/scene_string_names.h" void MeshInstance3DEditor::_node_removed(Node *p_node) { @@ -300,59 +301,67 @@ void MeshInstance3DEditor::_menu_option(int p_option) { ur->commit_action(); } break; case MENU_OPTION_CREATE_UV2: { - Ref mesh2 = node->get_mesh(); - if (!mesh2.is_valid()) { - err_dialog->set_text(TTR("Contained Mesh is not of type ArrayMesh.")); - err_dialog->popup_centered(); - return; - } + Ref primitive_mesh = Object::cast_to(*node->get_mesh()); + if (primitive_mesh.is_valid()) { + EditorUndoRedoManager *ur = EditorUndoRedoManager::get_singleton(); + ur->create_action(TTR("Unwrap UV2")); + ur->add_do_method(*primitive_mesh, "set_add_uv2", true); + ur->add_undo_method(*primitive_mesh, "set_add_uv2", primitive_mesh->get_add_uv2()); + ur->commit_action(); + } else { + Ref mesh2 = node->get_mesh(); + if (!mesh2.is_valid()) { + err_dialog->set_text(TTR("Contained Mesh is not of type ArrayMesh.")); + err_dialog->popup_centered(); + return; + } - String path = mesh2->get_path(); - int srpos = path.find("::"); - if (srpos != -1) { - String base = path.substr(0, srpos); - if (ResourceLoader::get_resource_type(base) == "PackedScene") { - if (!get_tree()->get_edited_scene_root() || get_tree()->get_edited_scene_root()->get_scene_file_path() != base) { - err_dialog->set_text(TTR("Mesh cannot unwrap UVs because it does not belong to the edited scene. Make it unique first.")); - err_dialog->popup_centered(); - return; + String path = mesh2->get_path(); + int srpos = path.find("::"); + if (srpos != -1) { + String base = path.substr(0, srpos); + if (ResourceLoader::get_resource_type(base) == "PackedScene") { + if (!get_tree()->get_edited_scene_root() || get_tree()->get_edited_scene_root()->get_scene_file_path() != base) { + err_dialog->set_text(TTR("Mesh cannot unwrap UVs because it does not belong to the edited scene. Make it unique first.")); + err_dialog->popup_centered(); + return; + } + } else { + if (FileAccess::exists(path + ".import")) { + err_dialog->set_text(TTR("Mesh cannot unwrap UVs because it belongs to another resource which was imported from another file type. Make it unique first.")); + err_dialog->popup_centered(); + return; + } } } else { if (FileAccess::exists(path + ".import")) { - err_dialog->set_text(TTR("Mesh cannot unwrap UVs because it belongs to another resource which was imported from another file type. Make it unique first.")); + err_dialog->set_text(TTR("Mesh cannot unwrap UVs because it was imported from another file type. Make it unique first.")); err_dialog->popup_centered(); return; } } - } else { - if (FileAccess::exists(path + ".import")) { - err_dialog->set_text(TTR("Mesh cannot unwrap UVs because it was imported from another file type. Make it unique first.")); + + Ref unwrapped_mesh = mesh2->duplicate(false); + + Error err = unwrapped_mesh->lightmap_unwrap(node->get_global_transform()); + if (err != OK) { + err_dialog->set_text(TTR("UV Unwrap failed, mesh may not be manifold?")); err_dialog->popup_centered(); return; } - } - - Ref unwrapped_mesh = mesh2->duplicate(false); - - Error err = unwrapped_mesh->lightmap_unwrap(node->get_global_transform()); - if (err != OK) { - err_dialog->set_text(TTR("UV Unwrap failed, mesh may not be manifold?")); - err_dialog->popup_centered(); - return; - } - - EditorUndoRedoManager *ur = EditorUndoRedoManager::get_singleton(); - ur->create_action(TTR("Unwrap UV2")); - ur->add_do_method(node, "set_mesh", unwrapped_mesh); - ur->add_do_reference(node); - ur->add_do_reference(mesh2.ptr()); + EditorUndoRedoManager *ur = EditorUndoRedoManager::get_singleton(); + ur->create_action(TTR("Unwrap UV2")); - ur->add_undo_method(node, "set_mesh", mesh2); - ur->add_undo_reference(unwrapped_mesh.ptr()); + ur->add_do_method(node, "set_mesh", unwrapped_mesh); + ur->add_do_reference(node); + ur->add_do_reference(mesh2.ptr()); - ur->commit_action(); + ur->add_undo_method(node, "set_mesh", mesh2); + ur->add_undo_reference(unwrapped_mesh.ptr()); + ur->commit_action(); + } } break; case MENU_OPTION_DEBUG_UV1: { Ref mesh2 = node->get_mesh();