Check target sizes to avoid reading beyond allocation
parent
d1ef28fa52
commit
add165c4a1
|
@ -536,35 +536,47 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) {
|
||||||
Mesh::Primitive::Target &target = targets[i];
|
Mesh::Primitive::Target &target = targets[i];
|
||||||
|
|
||||||
if (needPositions) {
|
if (needPositions) {
|
||||||
aiVector3D *positionDiff = nullptr;
|
if (target.position[0]->count != aim->mNumVertices) {
|
||||||
target.position[0]->ExtractData(positionDiff);
|
DefaultLogger::get()->warn("Positions of target in mesh \"" + mesh.name + "\" does not match the vertex count");
|
||||||
for (unsigned int vertexId = 0; vertexId < aim->mNumVertices; vertexId++) {
|
} else {
|
||||||
aiAnimMesh.mVertices[vertexId] += positionDiff[vertexId];
|
aiVector3D *positionDiff = nullptr;
|
||||||
|
target.position[0]->ExtractData(positionDiff);
|
||||||
|
for (unsigned int vertexId = 0; vertexId < aim->mNumVertices; vertexId++) {
|
||||||
|
aiAnimMesh.mVertices[vertexId] += positionDiff[vertexId];
|
||||||
|
}
|
||||||
|
delete[] positionDiff;
|
||||||
}
|
}
|
||||||
delete[] positionDiff;
|
|
||||||
}
|
}
|
||||||
if (needNormals) {
|
if (needNormals) {
|
||||||
aiVector3D *normalDiff = nullptr;
|
if (target.normal[0]->count != aim->mNumVertices) {
|
||||||
target.normal[0]->ExtractData(normalDiff);
|
DefaultLogger::get()->warn("Normals of target in mesh \"" + mesh.name + "\" does not match the vertex count");
|
||||||
for (unsigned int vertexId = 0; vertexId < aim->mNumVertices; vertexId++) {
|
} else {
|
||||||
aiAnimMesh.mNormals[vertexId] += normalDiff[vertexId];
|
aiVector3D *normalDiff = nullptr;
|
||||||
|
target.normal[0]->ExtractData(normalDiff);
|
||||||
|
for (unsigned int vertexId = 0; vertexId < aim->mNumVertices; vertexId++) {
|
||||||
|
aiAnimMesh.mNormals[vertexId] += normalDiff[vertexId];
|
||||||
|
}
|
||||||
|
delete[] normalDiff;
|
||||||
}
|
}
|
||||||
delete[] normalDiff;
|
|
||||||
}
|
}
|
||||||
if (needTangents) {
|
if (needTangents) {
|
||||||
Tangent *tangent = nullptr;
|
if (target.tangent[0]->count != aim->mNumVertices) {
|
||||||
attr.tangent[0]->ExtractData(tangent);
|
DefaultLogger::get()->warn("Tangents of target in mesh \"" + mesh.name + "\" does not match the vertex count");
|
||||||
|
} else {
|
||||||
|
Tangent *tangent = nullptr;
|
||||||
|
attr.tangent[0]->ExtractData(tangent);
|
||||||
|
|
||||||
aiVector3D *tangentDiff = nullptr;
|
aiVector3D *tangentDiff = nullptr;
|
||||||
target.tangent[0]->ExtractData(tangentDiff);
|
target.tangent[0]->ExtractData(tangentDiff);
|
||||||
|
|
||||||
for (unsigned int vertexId = 0; vertexId < aim->mNumVertices; ++vertexId) {
|
for (unsigned int vertexId = 0; vertexId < aim->mNumVertices; ++vertexId) {
|
||||||
tangent[vertexId].xyz += tangentDiff[vertexId];
|
tangent[vertexId].xyz += tangentDiff[vertexId];
|
||||||
aiAnimMesh.mTangents[vertexId] = tangent[vertexId].xyz;
|
aiAnimMesh.mTangents[vertexId] = tangent[vertexId].xyz;
|
||||||
aiAnimMesh.mBitangents[vertexId] = (aiAnimMesh.mNormals[vertexId] ^ tangent[vertexId].xyz) * tangent[vertexId].w;
|
aiAnimMesh.mBitangents[vertexId] = (aiAnimMesh.mNormals[vertexId] ^ tangent[vertexId].xyz) * tangent[vertexId].w;
|
||||||
|
}
|
||||||
|
delete[] tangent;
|
||||||
|
delete[] tangentDiff;
|
||||||
}
|
}
|
||||||
delete[] tangent;
|
|
||||||
delete[] tangentDiff;
|
|
||||||
}
|
}
|
||||||
if (mesh.weights.size() > i) {
|
if (mesh.weights.size() > i) {
|
||||||
aiAnimMesh.mWeight = mesh.weights[i];
|
aiAnimMesh.mWeight = mesh.weights[i];
|
||||||
|
|
Loading…
Reference in New Issue