Merge pull request #37273 from akien-mga/gltf-tangent-fix-32712

glTF: Fix tangent generation for non-blend shapes
This commit is contained in:
Rémi Verschelde 2020-04-28 20:32:37 +02:00 committed by GitHub
commit 2497740a4e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1075,24 +1075,15 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
array[Mesh::ARRAY_INDEX] = indices;
}
bool generated_tangents = false;
Variant erased_indices;
bool generate_tangents = (primitive == Mesh::PRIMITIVE_TRIANGLES && !a.has("TANGENT") && a.has("TEXCOORD_0") && a.has("NORMAL"));
if (primitive == Mesh::PRIMITIVE_TRIANGLES && !a.has("TANGENT") && a.has("TEXCOORD_0") && a.has("NORMAL")) {
if (generate_tangents) {
//must generate mikktspace tangents.. ergh..
Ref<SurfaceTool> st;
st.instance();
st->create_from_triangle_arrays(array);
if (!p.has("targets")) {
//morph targets should not be reindexed, as array size might differ
//removing indices is the best bet here
st->deindex();
erased_indices = a[Mesh::ARRAY_INDEX];
a[Mesh::ARRAY_INDEX] = Variant();
}
st->generate_tangents();
array = st->commit_to_arrays();
generated_tangents = true;
}
Array morphs;
@ -1207,10 +1198,9 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
array_copy[Mesh::ARRAY_TANGENT] = tangents_v4;
}
if (generated_tangents) {
if (generate_tangents) {
Ref<SurfaceTool> st;
st.instance();
array_copy[Mesh::ARRAY_INDEX] = erased_indices; //needed for tangent generation, erased by deindex
st->create_from_triangle_arrays(array_copy);
st->deindex();
st->generate_tangents();