diff --git a/core/error/error_macros.h b/core/error/error_macros.h index 65804b77964..f16e6ac81e6 100644 --- a/core/error/error_macros.h +++ b/core/error/error_macros.h @@ -730,6 +730,16 @@ void _err_flush_stdout(); } else \ ((void)0) +/** + * Warns about `m_msg` only when verbose mode is enabled. + */ +#define WARN_VERBOSE(m_msg) \ + { \ + if (is_print_verbose_enabled()) { \ + WARN_PRINT(m_msg); \ + } \ + } + // Print deprecated warning message macros. /** diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp index dea7bde56cc..81bc239c7d9 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -5280,14 +5280,13 @@ BoneAttachment3D *GLTFDocument::_generate_bone_attachment(Ref p_state GLTFMeshIndex GLTFDocument::_convert_mesh_to_gltf(Ref p_state, MeshInstance3D *p_mesh_instance) { ERR_FAIL_NULL_V(p_mesh_instance, -1); - if (p_mesh_instance->get_mesh().is_null()) { - return -1; - } + ERR_FAIL_COND_V_MSG(p_mesh_instance->get_mesh().is_null(), -1, "glTF: Tried to export a MeshInstance3D node named " + p_mesh_instance->get_name() + ", but it has no mesh. This node will be exported without a mesh."); + Ref mesh_resource = p_mesh_instance->get_mesh(); + ERR_FAIL_COND_V_MSG(mesh_resource->get_surface_count() == 0, -1, "glTF: Tried to export a MeshInstance3D node named " + p_mesh_instance->get_name() + ", but its mesh has no surfaces. This node will be exported without a mesh."); - Ref import_mesh = p_mesh_instance->get_mesh(); - Ref current_mesh = _mesh_to_importer_mesh(import_mesh); + Ref current_mesh = _mesh_to_importer_mesh(mesh_resource); Vector blend_weights; - int32_t blend_count = import_mesh->get_blend_shape_count(); + int32_t blend_count = mesh_resource->get_blend_shape_count(); blend_weights.resize(blend_count); for (int32_t blend_i = 0; blend_i < blend_count; blend_i++) { blend_weights.write[blend_i] = 0.0f; @@ -5398,6 +5397,12 @@ void GLTFDocument::_convert_scene_node(Ref p_state, Node *p_current, if (retflag) { return; } +#ifdef TOOLS_ENABLED + if (Engine::get_singleton()->is_editor_hint() && p_gltf_root != -1 && p_current->get_owner() == nullptr) { + WARN_VERBOSE("glTF export warning: Node '" + p_current->get_name() + "' has no owner. This is likely a temporary node generated by a @tool script. This would not be saved when saving the Godot scene, therefore it will not be exported to glTF."); + return; + } +#endif // TOOLS_ENABLED Ref gltf_node; gltf_node.instantiate(); gltf_node->set_name(_gen_unique_name(p_state, p_current->get_name()));