Merge pull request #86144 from jsjtxietian/disable-mesh-compression-for-2d

Disable mesh compression if vertex `position.z` is always 0
This commit is contained in:
Rémi Verschelde 2024-04-12 11:16:33 +02:00
commit 42ab525aa2
No known key found for this signature in database
GPG key ID: C3336907360768E1
3 changed files with 36 additions and 2 deletions

View file

@ -996,7 +996,16 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ImporterMesh> &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;
}

View file

@ -384,7 +384,22 @@ static Error _parse_obj(const String &p_path, List<Ref<ImporterMesh>> &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

View file

@ -3059,7 +3059,17 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> 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<Vector3> &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;
}