From 7d970b967e9c52ee50a2d5bada28a0b7cc0a3498 Mon Sep 17 00:00:00 2001 From: Lyuma Date: Fri, 10 Jun 2022 12:39:44 -0700 Subject: [PATCH] gltf: Allow more than 4 joints but warn and ignore them. --- modules/gltf/gltf_document.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp index 90423e77f658..1dcde937e3c8 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -2620,6 +2620,7 @@ Error GLTFDocument::_parse_meshes(Ref state) { return OK; } + bool has_warned = false; Array meshes = state->json["meshes"]; for (GLTFMeshIndex i = 0; i < meshes.size(); i++) { print_verbose("glTF: Parsing mesh: " + itos(i)); @@ -2692,11 +2693,16 @@ Error GLTFDocument::_parse_meshes(Ref state) { array[Mesh::ARRAY_COLOR] = _decode_accessor_as_color(state, a["COLOR_0"], true); has_vertex_color = true; } - if (a.has("JOINTS_0") && !a.has("JOINTS_1")) { + if (a.has("JOINTS_0")) { array[Mesh::ARRAY_BONES] = _decode_accessor_as_ints(state, a["JOINTS_0"], true); } - ERR_CONTINUE(a.has("JOINTS_0") && a.has("JOINTS_1")); - if (a.has("WEIGHTS_0") && !a.has("WEIGHTS_1")) { + if (a.has("WEIGHTS_1") && a.has("JOINTS_1")) { + if (!has_warned) { + WARN_PRINT("glTF: Meshes use more than 4 bone joints"); + has_warned = true; + } + } + if (a.has("WEIGHTS_0")) { Vector weights = _decode_accessor_as_floats(state, a["WEIGHTS_0"], true); { //gltf does not seem to normalize the weights for some reason.. int wc = weights.size(); @@ -2718,7 +2724,6 @@ Error GLTFDocument::_parse_meshes(Ref state) { } array[Mesh::ARRAY_WEIGHTS] = weights; } - ERR_CONTINUE(a.has("WEIGHTS_0") && a.has("WEIGHTS_1")); if (p.has("indices")) { Vector indices = _decode_accessor_as_ints(state, p["indices"], false);