diff --git a/editor/import/3d/editor_import_collada.cpp b/editor/import/3d/editor_import_collada.cpp index 58aa6a462d90..4b91b1431a8d 100644 --- a/editor/import/3d/editor_import_collada.cpp +++ b/editor/import/3d/editor_import_collada.cpp @@ -996,7 +996,16 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref &p surftool->generate_tangents(); } - if (p_mesh->get_blend_shape_count() != 0 || p_skin_controller) { + // Disable compression if all z equals 0 (the mesh is 2D). + bool is_mesh_2d = true; + for (int k = 0; k < vertex_array.size(); k++) { + if (!Math::is_zero_approx(vertex_array[k].vertex.z)) { + is_mesh_2d = false; + break; + } + }; + + if (p_mesh->get_blend_shape_count() != 0 || p_skin_controller || is_mesh_2d) { // Can't compress if attributes missing or if using vertex weights. mesh_flags &= ~RS::ARRAY_FLAG_COMPRESS_ATTRIBUTES; } diff --git a/editor/import/3d/resource_importer_obj.cpp b/editor/import/3d/resource_importer_obj.cpp index 62643eaa251d..242b483b5133 100644 --- a/editor/import/3d/resource_importer_obj.cpp +++ b/editor/import/3d/resource_importer_obj.cpp @@ -384,7 +384,22 @@ static Error _parse_obj(const String &p_path, List> &r_meshes, if (p_disable_compression) { mesh_flags = 0; + } else { + bool is_mesh_2d = true; + + // Disable compression if all z equals 0 (the mesh is 2D). + for (int i = 0; i < vertices.size(); i++) { + if (!Math::is_zero_approx(vertices[i].z)) { + is_mesh_2d = false; + break; + } + } + + if (is_mesh_2d) { + mesh_flags = 0; + } } + //groups are too annoying if (surf_tool->get_vertex_array().size()) { //another group going on, commit it diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp index 2b3a00a2245e..f8c35ab6d1f7 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -3059,7 +3059,17 @@ Error GLTFDocument::_parse_meshes(Ref p_state) { array[Mesh::ARRAY_TANGENT] = tangents; } - if (p_state->force_disable_compression || !a.has("POSITION") || !a.has("NORMAL") || p.has("targets") || (a.has("JOINTS_0") || a.has("JOINTS_1"))) { + // Disable compression if all z equals 0 (the mesh is 2D). + const Vector &vertices = array[Mesh::ARRAY_VERTEX]; + bool is_mesh_2d = true; + for (int k = 0; k < vertices.size(); k++) { + if (!Math::is_zero_approx(vertices[k].z)) { + is_mesh_2d = false; + break; + } + } + + if (p_state->force_disable_compression || is_mesh_2d || !a.has("POSITION") || !a.has("NORMAL") || p.has("targets") || (a.has("JOINTS_0") || a.has("JOINTS_1"))) { flags &= ~RS::ARRAY_FLAG_COMPRESS_ATTRIBUTES; }