mirror of
https://github.com/godotengine/godot.git
synced 2026-01-03 18:11:19 +03:00
Avoid singularity when generated tangents and validate that tangents are good enough when using compression
(cherry picked from commit 781cd27fe4)
This commit is contained in:
committed by
Rémi Verschelde
parent
43eae4312d
commit
6ba9c6bf6d
@@ -2810,7 +2810,7 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> p_state) {
|
||||
|
||||
Vector<Vector3> normals = array[Mesh::ARRAY_NORMAL];
|
||||
for (int k = 0; k < vertex_num; k++) {
|
||||
Vector3 tan = Vector3(0.0, 1.0, 0.0).cross(normals[k]);
|
||||
Vector3 tan = Vector3(normals[i].z, -normals[i].x, normals[i].y).cross(normals[k].normalized()).normalized();
|
||||
tangentsw[k * 4 + 0] = tan.x;
|
||||
tangentsw[k * 4 + 1] = tan.y;
|
||||
tangentsw[k * 4 + 2] = tan.z;
|
||||
@@ -2836,6 +2836,19 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> p_state) {
|
||||
}
|
||||
array = mesh_surface_tool->commit_to_arrays();
|
||||
|
||||
if ((flags & RS::ARRAY_FLAG_COMPRESS_ATTRIBUTES) && a.has("NORMAL") && (a.has("TANGENT") || generate_tangents)) {
|
||||
// Compression is enabled, so let's validate that the normals and tangents are correct.
|
||||
Vector<Vector3> normals = array[Mesh::ARRAY_NORMAL];
|
||||
Vector<float> tangents = array[Mesh::ARRAY_TANGENT];
|
||||
for (int vert = 0; vert < normals.size(); vert++) {
|
||||
Vector3 tan = Vector3(tangents[vert * 4 + 0], tangents[vert * 4 + 1], tangents[vert * 4 + 2]);
|
||||
if (abs(tan.dot(normals[vert])) > 0.0001) {
|
||||
// Tangent is not perpendicular to the normal, so we can't use compression.
|
||||
flags &= ~RS::ARRAY_FLAG_COMPRESS_ATTRIBUTES;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Array morphs;
|
||||
//blend shapes
|
||||
if (p.has("targets")) {
|
||||
|
||||
Reference in New Issue
Block a user