From 9a3a22d310b89c95e0252aee835175b8714888f7 Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Mon, 20 Dec 2021 00:44:17 +0100 Subject: [PATCH 1/3] Changes to for loops needed to prevent crash on some GLTF models --- .../model-serializers/src/GLTFSerializer.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libraries/model-serializers/src/GLTFSerializer.cpp b/libraries/model-serializers/src/GLTFSerializer.cpp index 9aadf951cca..23f319108b4 100755 --- a/libraries/model-serializers/src/GLTFSerializer.cpp +++ b/libraries/model-serializers/src/GLTFSerializer.cpp @@ -819,7 +819,7 @@ void GLTFSerializer::generateTargetData(int index, float weight, QVector storedValues; addArrayFromAccessor(accessor, storedValues); - for (int n = 0; n < storedValues.size(); n = n + 3) { + for (int n = 0; n + 2 < storedValues.size(); n = n + 3) { returnVector.push_back(glm::vec3(weight * storedValues[n], weight * storedValues[n + 1], weight * storedValues[n + 2])); } } @@ -1246,7 +1246,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash& QVector newJoints; QVector newWeights; - for (int n = 0; n < indices.size(); n = n + 3) { + for (int n = 0; n + 2 < indices.size(); n = n + 3) { int v1_index = (indices[n + 0] * 3); int v2_index = (indices[n + 1] * 3); int v3_index = (indices[n + 2] * 3); @@ -1356,17 +1356,17 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash& part.triangleIndices.append(validatedIndices); - for (int n = 0; n < vertices.size(); n = n + verticesStride) { + for (int n = 0; n + 2 < vertices.size(); n = n + verticesStride) { mesh.vertices.push_back(glm::vec3(vertices[n], vertices[n + 1], vertices[n + 2])); } - for (int n = 0; n < normals.size(); n = n + normalStride) { + for (int n = 0; n + 2 < normals.size(); n = n + normalStride) { mesh.normals.push_back(glm::vec3(normals[n], normals[n + 1], normals[n + 2])); } // TODO: add correct tangent generation if (tangents.size() == partVerticesCount * tangentStride) { - for (int n = 0; n < tangents.size(); n += tangentStride) { + for (int n = 0; n + tangentStride - 1 < tangents.size(); n += tangentStride) { float tanW = tangentStride == 4 ? tangents[n + 3] : 1; mesh.tangents.push_back(glm::vec3(tanW * tangents[n], tangents[n + 1], tanW * tangents[n + 2])); } @@ -1379,7 +1379,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash& } if (texcoords.size() == partVerticesCount * texCoordStride) { - for (int n = 0; n < texcoords.size(); n = n + 2) { + for (int n = 0; n + 1 < texcoords.size(); n = n + 2) { mesh.texCoords.push_back(glm::vec2(texcoords[n], texcoords[n + 1])); } } else { @@ -1391,7 +1391,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash& } if (texcoords2.size() == partVerticesCount * texCoord2Stride) { - for (int n = 0; n < texcoords2.size(); n = n + 2) { + for (int n = 0; n + 1 < texcoords2.size(); n = n + 2) { mesh.texCoords1.push_back(glm::vec2(texcoords2[n], texcoords2[n + 1])); } } else { @@ -1403,7 +1403,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash& } if (colors.size() == partVerticesCount * colorStride) { - for (int n = 0; n < colors.size(); n += colorStride) { + for (int n = 0; n + 2 < colors.size(); n += colorStride) { mesh.colors.push_back(ColorUtils::tosRGBVec3(glm::vec3(colors[n], colors[n + 1], colors[n + 2]))); } } else { @@ -1447,7 +1447,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash& } if (weights.size() == partVerticesCount * weightStride) { - for (int n = 0; n < weights.size(); n += weightStride) { + for (int n = 0; n + weightStride - 1 < weights.size(); n += weightStride) { clusterWeights.push_back(weights[n]); if (weightStride > 1) { clusterWeights.push_back(weights[n + 1]); @@ -2046,7 +2046,7 @@ bool GLTFSerializer::addArrayFromAccessor(GLTFAccessor& accessor, QVector& ou void GLTFSerializer::retriangulate(const QVector& inIndices, const QVector& in_vertices, const QVector& in_normals, QVector& outIndices, QVector& out_vertices, QVector& out_normals) { - for (int i = 0; i < inIndices.size(); i = i + 3) { + for (int i = 0; i + 2 < inIndices.size(); i = i + 3) { int idx1 = inIndices[i]; int idx2 = inIndices[i+1]; From 7106482c589c60bde509185c2a0a7a410649c52a Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Mon, 20 Dec 2021 18:49:13 +0100 Subject: [PATCH 2/3] Update libraries/model-serializers/src/GLTFSerializer.cpp Co-authored-by: David Rowe --- libraries/model-serializers/src/GLTFSerializer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/model-serializers/src/GLTFSerializer.cpp b/libraries/model-serializers/src/GLTFSerializer.cpp index 23f319108b4..bed11531db5 100755 --- a/libraries/model-serializers/src/GLTFSerializer.cpp +++ b/libraries/model-serializers/src/GLTFSerializer.cpp @@ -1356,7 +1356,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash& part.triangleIndices.append(validatedIndices); - for (int n = 0; n + 2 < vertices.size(); n = n + verticesStride) { + for (int n = 0; n + verticesStride - 1 < vertices.size(); n = n + verticesStride) { mesh.vertices.push_back(glm::vec3(vertices[n], vertices[n + 1], vertices[n + 2])); } From a7883fc588de6e784f0da750503c5e24ac667c9e Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Mon, 20 Dec 2021 18:49:25 +0100 Subject: [PATCH 3/3] Update libraries/model-serializers/src/GLTFSerializer.cpp Co-authored-by: David Rowe --- libraries/model-serializers/src/GLTFSerializer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/model-serializers/src/GLTFSerializer.cpp b/libraries/model-serializers/src/GLTFSerializer.cpp index bed11531db5..389fe3534a5 100755 --- a/libraries/model-serializers/src/GLTFSerializer.cpp +++ b/libraries/model-serializers/src/GLTFSerializer.cpp @@ -1360,7 +1360,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash& mesh.vertices.push_back(glm::vec3(vertices[n], vertices[n + 1], vertices[n + 2])); } - for (int n = 0; n + 2 < normals.size(); n = n + normalStride) { + for (int n = 0; n + normalStride - 1 < normals.size(); n = n + normalStride) { mesh.normals.push_back(glm::vec3(normals[n], normals[n + 1], normals[n + 2])); }