summaryrefslogtreecommitdiffstats
path: root/editor
diff options
context:
space:
mode:
authorHugo Locurcio <hugo.locurcio@hugo.pro>2023-10-07 02:18:55 +0200
committerHugo Locurcio <hugo.locurcio@hugo.pro>2023-10-07 02:18:55 +0200
commitac723b3e44855e67f31fa8a69fd8a90f828d526d (patch)
treefddd605e2d157ae8f84a2365ad3c14a9b4508caa /editor
parent6916349697a4339216469e9bf5899b983d78db07 (diff)
downloadredot-engine-ac723b3e44855e67f31fa8a69fd8a90f828d526d.tar.gz
Enable UV2 on primitive meshes when using the MeshInstance3D context menu
This makes it easier to discover the UV2 generation functionality on primitive meshes.
Diffstat (limited to 'editor')
-rw-r--r--editor/plugins/mesh_instance_3d_editor_plugin.cpp85
1 files 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 8d112446a3..eec375cbea 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<ArrayMesh> 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<PrimitiveMesh> primitive_mesh = Object::cast_to<PrimitiveMesh>(*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<ArrayMesh> 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<ArrayMesh> 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<ArrayMesh> 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<Mesh> mesh2 = node->get_mesh();