mirror of
https://github.com/godotengine/godot.git
synced 2024-12-03 09:52:18 +08:00
Mesh instance UV2 unwrapping improvements:
Enforce foreign resource modification rules. Add more helpful error handling for ArrayMesh unwrapping.
This commit is contained in:
parent
06d5189167
commit
e865bad06a
@ -1279,13 +1279,11 @@ void EditorNode::save_resource_as(const Ref<Resource> &p_resource, const String
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else if (FileAccess::exists(path + ".import")) {
|
||||||
if (FileAccess::exists(path + ".import")) {
|
|
||||||
show_warning(TTR("This resource can't be saved because it was imported from another file. Make it unique first."));
|
show_warning(TTR("This resource can't be saved because it was imported from another file. Make it unique first."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
file->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
|
file->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
|
||||||
saving_resource = p_resource;
|
saving_resource = p_resource;
|
||||||
@ -4062,12 +4060,10 @@ bool EditorNode::is_resource_read_only(Ref<Resource> p_resource, bool p_foreign_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else if (FileAccess::exists(path + ".import")) {
|
||||||
// The resource is not a subresource, but if it has an .import file, it's imported so treat it as read only.
|
// The resource is not a subresource, but if it has an .import file, it's imported so treat it as read only.
|
||||||
if (FileAccess::exists(path + ".import")) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -301,21 +301,14 @@ void MeshInstance3DEditor::_menu_option(int p_option) {
|
|||||||
ur->commit_action();
|
ur->commit_action();
|
||||||
} break;
|
} break;
|
||||||
case MENU_OPTION_CREATE_UV2: {
|
case MENU_OPTION_CREATE_UV2: {
|
||||||
Ref<PrimitiveMesh> primitive_mesh = Object::cast_to<PrimitiveMesh>(*node->get_mesh());
|
Ref<Mesh> mesh2 = node->get_mesh();
|
||||||
if (primitive_mesh.is_valid()) {
|
if (!mesh.is_valid()) {
|
||||||
EditorUndoRedoManager *ur = EditorUndoRedoManager::get_singleton();
|
err_dialog->set_text(TTR("No mesh to unwrap."));
|
||||||
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();
|
err_dialog->popup_centered();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test if we are allowed to unwrap this mesh resource.
|
||||||
String path = mesh2->get_path();
|
String path = mesh2->get_path();
|
||||||
int srpos = path.find("::");
|
int srpos = path.find("::");
|
||||||
if (srpos != -1) {
|
if (srpos != -1) {
|
||||||
@ -341,7 +334,48 @@ void MeshInstance3DEditor::_menu_option(int p_option) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref<ArrayMesh> unwrapped_mesh = mesh2->duplicate(false);
|
Ref<PrimitiveMesh> primitive_mesh = mesh2;
|
||||||
|
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> array_mesh = mesh2;
|
||||||
|
if (!array_mesh.is_valid()) {
|
||||||
|
err_dialog->set_text(TTR("Contained Mesh is not of type ArrayMesh."));
|
||||||
|
err_dialog->popup_centered();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Preemptively evaluate common fail cases for lightmap unwrapping.
|
||||||
|
{
|
||||||
|
if (array_mesh->get_blend_shape_count() > 0) {
|
||||||
|
err_dialog->set_text(TTR("Can't unwrap mesh with blend shapes."));
|
||||||
|
err_dialog->popup_centered();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < array_mesh->get_surface_count(); i++) {
|
||||||
|
Mesh::PrimitiveType primitive = array_mesh->surface_get_primitive_type(i);
|
||||||
|
|
||||||
|
if (primitive != Mesh::PRIMITIVE_TRIANGLES) {
|
||||||
|
err_dialog->set_text(TTR("Only triangles are supported for lightmap unwrap."));
|
||||||
|
err_dialog->popup_centered();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t format = array_mesh->surface_get_format(i);
|
||||||
|
if (format & Mesh::ArrayFormat::ARRAY_FORMAT_NORMAL) {
|
||||||
|
err_dialog->set_text(TTR("Normals are required for lightmap unwrap."));
|
||||||
|
err_dialog->popup_centered();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ref<ArrayMesh> unwrapped_mesh = array_mesh->duplicate(false);
|
||||||
|
|
||||||
Error err = unwrapped_mesh->lightmap_unwrap(node->get_global_transform());
|
Error err = unwrapped_mesh->lightmap_unwrap(node->get_global_transform());
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
@ -355,9 +389,9 @@ void MeshInstance3DEditor::_menu_option(int p_option) {
|
|||||||
|
|
||||||
ur->add_do_method(node, "set_mesh", unwrapped_mesh);
|
ur->add_do_method(node, "set_mesh", unwrapped_mesh);
|
||||||
ur->add_do_reference(node);
|
ur->add_do_reference(node);
|
||||||
ur->add_do_reference(mesh2.ptr());
|
ur->add_do_reference(array_mesh.ptr());
|
||||||
|
|
||||||
ur->add_undo_method(node, "set_mesh", mesh2);
|
ur->add_undo_method(node, "set_mesh", array_mesh);
|
||||||
ur->add_undo_reference(unwrapped_mesh.ptr());
|
ur->add_undo_reference(unwrapped_mesh.ptr());
|
||||||
|
|
||||||
ur->commit_action();
|
ur->commit_action();
|
||||||
|
Loading…
Reference in New Issue
Block a user