From 7a4d8ec4125d9f5c8e662474ea152b7c2f01fe3e Mon Sep 17 00:00:00 2001 From: ockeymm <88309682+ockeymm@users.noreply.github.com> Date: Tue, 26 Sep 2023 13:20:13 +0800 Subject: [PATCH] Reduce memory consumption in JoinVerticesProcess::ProcessMesh() significantly --- code/PostProcessing/JoinVerticesProcess.cpp | 58 ++++++++++----------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/code/PostProcessing/JoinVerticesProcess.cpp b/code/PostProcessing/JoinVerticesProcess.cpp index d36915e0c..650336040 100644 --- a/code/PostProcessing/JoinVerticesProcess.cpp +++ b/code/PostProcessing/JoinVerticesProcess.cpp @@ -145,7 +145,7 @@ bool areVerticesEqual( } template -void updateXMeshVertices(XMesh *pMesh, std::vector &uniqueVertices) { +void updateXMeshVertices(XMesh *pMesh, std::vector &uniqueVertices) { // replace vertex data with the unique data sets pMesh->mNumVertices = (unsigned int)uniqueVertices.size(); @@ -157,52 +157,52 @@ void updateXMeshVertices(XMesh *pMesh, std::vector &uniqueVertices) { // Position, if present (check made for aiAnimMesh) if (pMesh->mVertices) { - delete [] pMesh->mVertices; + aiVector3D *oldVertices = pMesh->mVertices; pMesh->mVertices = new aiVector3D[pMesh->mNumVertices]; - for (unsigned int a = 0; a < pMesh->mNumVertices; a++) { - pMesh->mVertices[a] = uniqueVertices[a].position; - } + for (unsigned int a = 0; a < pMesh->mNumVertices; a++) + pMesh->mVertices[a] = oldVertices[uniqueVertices[a]]; + delete [] oldVertices; } // Normals, if present if (pMesh->mNormals) { - delete [] pMesh->mNormals; + aiVector3D *oldNormals = pMesh->mNormals; pMesh->mNormals = new aiVector3D[pMesh->mNumVertices]; - for( unsigned int a = 0; a < pMesh->mNumVertices; a++) { - pMesh->mNormals[a] = uniqueVertices[a].normal; - } + for (unsigned int a = 0; a < pMesh->mNumVertices; a++) + pMesh->mNormals[a] = oldNormals[uniqueVertices[a]]; + delete oldNormals; } // Tangents, if present if (pMesh->mTangents) { - delete [] pMesh->mTangents; + aiVector3D *oldTangents = pMesh->mTangents; pMesh->mTangents = new aiVector3D[pMesh->mNumVertices]; - for (unsigned int a = 0; a < pMesh->mNumVertices; a++) { - pMesh->mTangents[a] = uniqueVertices[a].tangent; - } + for (unsigned int a = 0; a < pMesh->mNumVertices; a++) + pMesh->mTangents[a] = oldTangents[uniqueVertices[a]]; + delete oldTangents; } // Bitangents as well if (pMesh->mBitangents) { - delete [] pMesh->mBitangents; + aiVector3D *oldBitangents = pMesh->mBitangents; pMesh->mBitangents = new aiVector3D[pMesh->mNumVertices]; - for (unsigned int a = 0; a < pMesh->mNumVertices; a++) { - pMesh->mBitangents[a] = uniqueVertices[a].bitangent; - } + for (unsigned int a = 0; a < pMesh->mNumVertices; a++) + pMesh->mBitangents[a] = oldBitangents[uniqueVertices[a]]; + delete oldBitangents; } // Vertex colors for (unsigned int a = 0; pMesh->HasVertexColors(a); a++) { - delete [] pMesh->mColors[a]; + aiColor4D *oldColors = pMesh->mColors[a]; pMesh->mColors[a] = new aiColor4D[pMesh->mNumVertices]; - for( unsigned int b = 0; b < pMesh->mNumVertices; b++) { - pMesh->mColors[a][b] = uniqueVertices[b].colors[a]; - } + for (unsigned int b = 0; b < pMesh->mNumVertices; b++) + pMesh->mColors[a][b] = oldColors[uniqueVertices[b]]; + delete [] oldColors; } // Texture coords for (unsigned int a = 0; pMesh->HasTextureCoords(a); a++) { - delete [] pMesh->mTextureCoords[a]; + aiVector3D *oldTextureCoords = pMesh->mTextureCoords[a]; pMesh->mTextureCoords[a] = new aiVector3D[pMesh->mNumVertices]; - for (unsigned int b = 0; b < pMesh->mNumVertices; b++) { - pMesh->mTextureCoords[a][b] = uniqueVertices[b].texcoords[a]; - } + for (unsigned int b = 0; b < pMesh->mNumVertices; b++) + pMesh->mTextureCoords[a][b] = oldTextureCoords[uniqueVertices[b]]; + delete [] oldTextureCoords; } } @@ -270,7 +270,7 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { } // We'll never have more vertices afterwards. - std::vector uniqueVertices; + std::vector uniqueVertices; uniqueVertices.reserve( pMesh->mNumVertices); // For each vertex the index of the vertex it was replaced by. @@ -311,7 +311,7 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { const bool hasAnimMeshes = pMesh->mNumAnimMeshes > 0; // We'll never have more vertices afterwards. - std::vector> uniqueAnimatedVertices; + std::vector> uniqueAnimatedVertices; if (hasAnimMeshes) { uniqueAnimatedVertices.resize(pMesh->mNumAnimMeshes); for (unsigned int animMeshIndex = 0; animMeshIndex < pMesh->mNumAnimMeshes; animMeshIndex++) { @@ -345,10 +345,10 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { //keep track of its index and increment 1 replaceIndex[a] = newIndex++; // add the vertex to the unique vertices - uniqueVertices.push_back(v); + uniqueVertices.push_back(a); if (hasAnimMeshes) { for (unsigned int animMeshIndex = 0; animMeshIndex < pMesh->mNumAnimMeshes; animMeshIndex++) { - uniqueAnimatedVertices[animMeshIndex].emplace_back(pMesh->mAnimMeshes[animMeshIndex], a); + uniqueAnimatedVertices[animMeshIndex].emplace_back(a); } } } else{