summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Franke <arnfranke@yahoo.com>2024-02-03 21:41:00 -0600
committerAaron Franke <arnfranke@yahoo.com>2024-02-04 02:58:29 -0600
commit2d38c980ee91bae816fd84e6cffb779c291ab089 (patch)
treeea7fc247b0306cd0fc6d7dda9a0a5dc197e5448c
parentb4e2a24c1f62088b3f7ce0197afc90832fc25009 (diff)
downloadredot-engine-2d38c980ee91bae816fd84e6cffb779c291ab089.tar.gz
Fix GLTF exporting invalid meshes and attempting to export gizmo meshes
-rw-r--r--core/error/error_macros.h10
-rw-r--r--modules/gltf/gltf_document.cpp17
2 files changed, 21 insertions, 6 deletions
diff --git a/core/error/error_macros.h b/core/error/error_macros.h
index 016c963e04..ab7dbcbd44 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 f2dccf6d68..7b8c4fe655 100644
--- a/modules/gltf/gltf_document.cpp
+++ b/modules/gltf/gltf_document.cpp
@@ -5413,14 +5413,13 @@ BoneAttachment3D *GLTFDocument::_generate_bone_attachment(Ref<GLTFState> p_state
GLTFMeshIndex GLTFDocument::_convert_mesh_to_gltf(Ref<GLTFState> 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> 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<Mesh> import_mesh = p_mesh_instance->get_mesh();
- Ref<ImporterMesh> current_mesh = _mesh_to_importer_mesh(import_mesh);
+ Ref<ImporterMesh> current_mesh = _mesh_to_importer_mesh(mesh_resource);
Vector<float> 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;
@@ -5531,6 +5530,12 @@ void GLTFDocument::_convert_scene_node(Ref<GLTFState> 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<GLTFNode> gltf_node;
gltf_node.instantiate();
gltf_node->set_name(_gen_unique_name(p_state, p_current->get_name()));