Merge pull request #33794 from nekomatata/gltf-morph-shapes-crash2
Error instead of crash in gltf import with more than one morph target
This commit is contained in:
commit
28613ab8c9
1 changed files with 6 additions and 0 deletions
|
@ -2357,6 +2357,7 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
|
||||||
const int output = s["output"];
|
const int output = s["output"];
|
||||||
|
|
||||||
GLTFAnimation::Interpolation interp = GLTFAnimation::INTERP_LINEAR;
|
GLTFAnimation::Interpolation interp = GLTFAnimation::INTERP_LINEAR;
|
||||||
|
int output_count = 1;
|
||||||
if (s.has("interpolation")) {
|
if (s.has("interpolation")) {
|
||||||
const String &in = s["interpolation"];
|
const String &in = s["interpolation"];
|
||||||
if (in == "STEP") {
|
if (in == "STEP") {
|
||||||
|
@ -2365,8 +2366,10 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
|
||||||
interp = GLTFAnimation::INTERP_LINEAR;
|
interp = GLTFAnimation::INTERP_LINEAR;
|
||||||
} else if (in == "CATMULLROMSPLINE") {
|
} else if (in == "CATMULLROMSPLINE") {
|
||||||
interp = GLTFAnimation::INTERP_CATMULLROMSPLINE;
|
interp = GLTFAnimation::INTERP_CATMULLROMSPLINE;
|
||||||
|
output_count = 3;
|
||||||
} else if (in == "CUBICSPLINE") {
|
} else if (in == "CUBICSPLINE") {
|
||||||
interp = GLTFAnimation::INTERP_CUBIC_SPLINE;
|
interp = GLTFAnimation::INTERP_CUBIC_SPLINE;
|
||||||
|
output_count = 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2396,6 +2399,9 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
|
||||||
|
|
||||||
track->weight_tracks.resize(wc);
|
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;
|
const int wlen = weights.size() / wc;
|
||||||
PoolVector<float>::Read r = weights.read();
|
PoolVector<float>::Read r = weights.read();
|
||||||
for (int k = 0; k < wc; k++) { //separate tracks, having them together is not such a good idea
|
for (int k = 0; k < wc; k++) { //separate tracks, having them together is not such a good idea
|
||||||
|
|
Loading…
Reference in a new issue