Переглянути джерело

Merge pull request #4699 from turol/smd-fixes

SMD fixes
Kim Kulling 3 роки тому
батько
коміт
aa521569f7
1 змінених файлів з 27 додано та 44 видалено
  1. 27 44
      code/AssetLib/SMD/SMDLoader.cpp

+ 27 - 44
code/AssetLib/SMD/SMDLoader.cpp

@@ -147,10 +147,8 @@ void SMDImporter::InternReadFile( const std::string& pFile, aiScene* scene, IOSy
 
     if (!asBones.empty()) {
         // Check whether all bones have been initialized
-        for (std::vector<SMD::Bone>::const_iterator
-                i =  asBones.begin();
-                i != asBones.end();++i) {
-            if (!(*i).mName.length()) {
+        for (const auto &asBone : asBones) {
+            if (!asBone.mName.length()) {
                 ASSIMP_LOG_WARN("SMD: Not all bones have been initialized");
                 break;
             }
@@ -210,14 +208,10 @@ void SMDImporter::LogWarning(const char* msg) {
 void SMDImporter::FixTimeValues() {
     double dDelta = (double)iSmallestFrame;
     double dMax = 0.0f;
-    for (std::vector<SMD::Bone>::iterator
-            iBone =  asBones.begin();
-            iBone != asBones.end();++iBone) {
-        for (std::vector<SMD::Bone::Animation::MatrixKey>::iterator
-                iKey =  (*iBone).sAnim.asKeys.begin();
-                iKey != (*iBone).sAnim.asKeys.end();++iKey) {
-            (*iKey).dTime -= dDelta;
-            dMax = std::max(dMax, (*iKey).dTime);
+    for (auto &asBone : asBones) {
+        for (auto &asKey : asBone.sAnim.asKeys) {
+            asKey.dTime -= dDelta;
+            dMax = std::max(dMax, asKey.dTime);
         }
     }
     dLengthOfAnim = dMax;
@@ -237,7 +231,7 @@ void SMDImporter::CreateOutputMeshes() {
     pScene->mMeshes = new aiMesh*[pScene->mNumMeshes];
 
     typedef std::vector<unsigned int> FaceList;
-    FaceList* aaiFaces = new FaceList[pScene->mNumMeshes];
+    std::unique_ptr<FaceList[]> aaiFaces(new FaceList[pScene->mNumMeshes]);
 
     // approximate the space that will be required
     unsigned int iNum = (unsigned int)asTriangles.size() / pScene->mNumMeshes;
@@ -248,17 +242,14 @@ void SMDImporter::CreateOutputMeshes() {
 
     // collect all faces
     iNum = 0;
-    for (std::vector<SMD::Face>::const_iterator
-            iFace =  asTriangles.begin();
-            iFace != asTriangles.end();++iFace,++iNum) {
-        if (UINT_MAX == (*iFace).iTexture) {
-            aaiFaces[(*iFace).iTexture].push_back( 0 );
-        } else if ((*iFace).iTexture >= aszTextures.size()) {
+    for (const auto &asTriangle : asTriangles) {
+        if (asTriangle.iTexture >= aszTextures.size()) {
             ASSIMP_LOG_INFO("[SMD/VTA] Material index overflow in face");
-            aaiFaces[(*iFace).iTexture].push_back((unsigned int)aszTextures.size()-1);
+            aaiFaces[asTriangle.iTexture].push_back((unsigned int)aszTextures.size()-1);
         } else {
-            aaiFaces[(*iFace).iTexture].push_back(iNum);
+            aaiFaces[asTriangle.iTexture].push_back(iNum);
         }
+        ++iNum;
     }
 
     // now create the output meshes
@@ -275,7 +266,7 @@ void SMDImporter::CreateOutputMeshes() {
         typedef std::pair<unsigned int,float> TempWeightListEntry;
         typedef std::vector< TempWeightListEntry > TempBoneWeightList;
 
-        TempBoneWeightList* aaiBones = new TempBoneWeightList[asBones.size()]();
+        std::unique_ptr<TempBoneWeightList[]> aaiBones(new TempBoneWeightList[asBones.size()]());
 
         // try to reserve enough memory without wasting too much
         for (unsigned int iBone = 0; iBone < asBones.size();++iBone) {
@@ -351,8 +342,7 @@ void SMDImporter::CreateOutputMeshes() {
 
                         if (fSum) {
                             fSum = 1 / fSum;
-                            for (unsigned int iBone = 0;iBone < face.avVertices[iVert].aiBoneLinks.size();++iBone) {
-                                TempWeightListEntry& pairval = face.avVertices[iVert].aiBoneLinks[iBone];
+                            for (auto &pairval : face.avVertices[iVert].aiBoneLinks) {
                                 if (pairval.first >= asBones.size()) {
                                     continue;
                                 }
@@ -398,9 +388,7 @@ void SMDImporter::CreateOutputMeshes() {
                 ++iNum;
             }
         }
-        delete[] aaiBones;
     }
-    delete[] aaiFaces;
 }
 
 // ------------------------------------------------------------------------------------------------
@@ -411,8 +399,7 @@ void SMDImporter::AddBoneChildren(aiNode* pcNode, uint32_t iParent) {
     ai_assert( nullptr == pcNode->mChildren);
 
     // first count ...
-    for (unsigned int i = 0; i < asBones.size();++i) {
-        SMD::Bone& bone = asBones[i];
+    for (auto &bone : asBones) {
         if (bone.iParent == iParent) {
             ++pcNode->mNumChildren;
         }
@@ -516,27 +503,25 @@ void SMDImporter::CreateOutputAnimation(int index, const std::string &name) {
 
     // now build valid keys
     unsigned int a = 0;
-    for (std::vector<SMD::Bone>::const_iterator i = asBones.begin(); i != asBones.end(); ++i) {
+    for (const auto &asBone : asBones) {
         aiNodeAnim* p = pp[a] = new aiNodeAnim();
 
         // copy the name of the bone
-        p->mNodeName.Set(i->mName);
+        p->mNodeName.Set(asBone.mName);
 
-        p->mNumRotationKeys = (unsigned int)(*i).sAnim.asKeys.size();
+        p->mNumRotationKeys = (unsigned int)asBone.sAnim.asKeys.size();
         if (p->mNumRotationKeys){
             p->mNumPositionKeys = p->mNumRotationKeys;
             aiVectorKey* pVecKeys = p->mPositionKeys = new aiVectorKey[p->mNumRotationKeys];
             aiQuatKey* pRotKeys = p->mRotationKeys = new aiQuatKey[p->mNumRotationKeys];
 
-            for (std::vector<SMD::Bone::Animation::MatrixKey>::const_iterator
-                    qq = (*i).sAnim.asKeys.begin();
-                    qq != (*i).sAnim.asKeys.end(); ++qq) {
-                pRotKeys->mTime = pVecKeys->mTime = (*qq).dTime;
+            for (const auto &asKey : asBone.sAnim.asKeys) {
+                pRotKeys->mTime = pVecKeys->mTime = asKey.dTime;
 
                 // compute the rotation quaternion from the euler angles
                 // aiQuaternion: The order of the parameters is yzx?
-                pRotKeys->mValue = aiQuaternion((*qq).vRot.y, (*qq).vRot.z, (*qq).vRot.x);
-                pVecKeys->mValue = (*qq).vPos;
+                pRotKeys->mValue = aiQuaternion(asKey.vRot.y, asKey.vRot.z, asKey.vRot.x);
+                pVecKeys->mValue = asKey.vPos;
 
                 ++pVecKeys; ++pRotKeys;
             }
@@ -982,8 +967,8 @@ void SMDImporter::ParseTriangle(const char* szCurrent, const char** szCurrentOut
     SkipSpacesAndLineEnd(szCurrent,&szCurrent);
 
     // load three vertices
-    for (unsigned int iVert = 0; iVert < 3;++iVert) {
-        ParseVertex(szCurrent,&szCurrent, face.avVertices[iVert]);
+    for (auto &avVertex : face.avVertices) {
+        ParseVertex(szCurrent,&szCurrent, avVertex);
     }
     *szCurrentOut = szCurrent;
 }
@@ -1080,13 +1065,11 @@ void SMDImporter::ParseVertex(const char* szCurrent,
     }
     vertex.aiBoneLinks.resize(iSize,std::pair<unsigned int, float>(0,0.0f));
 
-    for (std::vector<std::pair<unsigned int, float> >::iterator
-            i =  vertex.aiBoneLinks.begin();
-            i != vertex.aiBoneLinks.end();++i) {
-        if(!ParseUnsignedInt(szCurrent,&szCurrent,(*i).first)) {
+    for (auto &aiBoneLink : vertex.aiBoneLinks) {
+        if(!ParseUnsignedInt(szCurrent,&szCurrent,aiBoneLink.first)) {
             SMDI_PARSE_RETURN;
         }
-        if(!ParseFloat(szCurrent,&szCurrent,(*i).second)) {
+        if(!ParseFloat(szCurrent,&szCurrent,aiBoneLink.second)) {
             SMDI_PARSE_RETURN;
         }
     }