Просмотр исходного кода

Merge pull request #4940 from ockeymm123/master

fix regression in join vertices post process.
Kim Kulling 2 лет назад
Родитель
Сommit
a14696b9ec

+ 8 - 20
code/PostProcessing/JoinVerticesProcess.cpp

@@ -55,13 +55,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include <unordered_map>
 
 using namespace Assimp;
-// ------------------------------------------------------------------------------------------------
-// Constructor to be privately used by Importer
-JoinVerticesProcess::JoinVerticesProcess() = default;
-
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-JoinVerticesProcess::~JoinVerticesProcess() = default;
 
 // ------------------------------------------------------------------------------------------------
 // Returns whether the processing step is present in the given flag field.
@@ -251,6 +244,9 @@ private:
     unsigned mNumUVChannels;
     unsigned mNumColorChannels;
 };
+
+static constexpr size_t JOINED_VERTICES_MARK = 0x80000000u;
+
 // now start the JoinVerticesProcess
 int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) {
     static_assert( AI_MAX_NUMBER_OF_COLOR_SETS    == 8, "AI_MAX_NUMBER_OF_COLOR_SETS    == 8");
@@ -357,7 +353,8 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) {
             }
         } else{
             // if the vertex is already there just find the replace index that is appropriate to it
-            replaceIndex[a] = it->second;
+			// mark it with JOINED_VERTICES_MARK
+            replaceIndex[a] = it->second | JOINED_VERTICES_MARK;
         }
     }
 
@@ -386,7 +383,7 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) {
     for( unsigned int a = 0; a < pMesh->mNumFaces; a++) {
         aiFace& face = pMesh->mFaces[a];
         for( unsigned int b = 0; b < face.mNumIndices; b++) {
-            face.mIndices[b] = replaceIndex[face.mIndices[b]] & ~0x80000000;
+            face.mIndices[b] = replaceIndex[face.mIndices[b]] & ~JOINED_VERTICES_MARK;
         }
     }
 
@@ -400,17 +397,8 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) {
             for ( unsigned int b = 0; b < bone->mNumWeights; b++ ) {
                 const aiVertexWeight& ow = bone->mWeights[ b ];
                 // if the vertex is a unique one, translate it
-                if ( !( replaceIndex[ ow.mVertexId ] & 0x80000000 ) ) {
-                    bool weightAlreadyExists = false;
-                    for (std::vector<aiVertexWeight>::iterator vit = newWeights.begin(); vit != newWeights.end(); ++vit) {
-                        if (vit->mVertexId == replaceIndex[ow.mVertexId]) {
-                            weightAlreadyExists = true;
-                            break;
-                        }
-                    }
-                    if (weightAlreadyExists) {
-                        continue;
-                    }
+				// filter out joined vertices by JOINED_VERTICES_MARK.
+                if ( !( replaceIndex[ ow.mVertexId ] & JOINED_VERTICES_MARK ) ) {
                     aiVertexWeight nw;
                     nw.mVertexId = replaceIndex[ ow.mVertexId ];
                     nw.mWeight = ow.mWeight;

+ 7 - 2
code/PostProcessing/JoinVerticesProcess.h

@@ -64,8 +64,13 @@ namespace Assimp
  */
 class ASSIMP_API JoinVerticesProcess : public BaseProcess {
 public:
-    JoinVerticesProcess();
-    ~JoinVerticesProcess();
+    // -------------------------------------------------------------------
+    /// @brief  The default class constructor.
+    JoinVerticesProcess() = default;
+    
+    // -------------------------------------------------------------------
+    /// @brief  The default class destructor.
+    ~JoinVerticesProcess() = default;
 
     // -------------------------------------------------------------------
     /** Returns whether the processing step is present in the given flag field.