Ver código fonte

Merge pull request #33794 from nekomatata/gltf-morph-shapes-crash2

Error instead of crash in gltf import with more than one morph target
Rémi Verschelde 5 anos atrás
pai
commit
28613ab8c9
1 arquivos alterados com 6 adições e 0 exclusões
  1. 6 0
      editor/import/editor_scene_importer_gltf.cpp

+ 6 - 0
editor/import/editor_scene_importer_gltf.cpp

@@ -2357,6 +2357,7 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
 			const int output = s["output"];
 
 			GLTFAnimation::Interpolation interp = GLTFAnimation::INTERP_LINEAR;
+			int output_count = 1;
 			if (s.has("interpolation")) {
 				const String &in = s["interpolation"];
 				if (in == "STEP") {
@@ -2365,8 +2366,10 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
 					interp = GLTFAnimation::INTERP_LINEAR;
 				} else if (in == "CATMULLROMSPLINE") {
 					interp = GLTFAnimation::INTERP_CATMULLROMSPLINE;
+					output_count = 3;
 				} else if (in == "CUBICSPLINE") {
 					interp = GLTFAnimation::INTERP_CUBIC_SPLINE;
+					output_count = 3;
 				}
 			}
 
@@ -2396,6 +2399,9 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
 
 				track->weight_tracks.resize(wc);
 
+				const int expected_value_count = times.size() * output_count * wc;
+				ERR_FAIL_COND_V_MSG(weights.size() != expected_value_count, ERR_PARSE_ERROR, "Invalid weight data, expected " + itos(expected_value_count) + " weight values, got " + itos(weights.size()) + " instead.");
+
 				const int wlen = weights.size() / wc;
 				PoolVector<float>::Read r = weights.read();
 				for (int k = 0; k < wc; k++) { //separate tracks, having them together is not such a good idea