Browse Source

Normalize() is replaced with NormalizeSafe() to prevent invalid vectors generation

Vitaly Ovchinnikov 9 years ago
parent
commit
b6f14eb917
3 changed files with 12 additions and 2 deletions
  1. 2 2
      code/GenVertexNormalsProcess.cpp
  2. 2 0
      include/assimp/vector3.h
  3. 8 0
      include/assimp/vector3.inl

+ 2 - 2
code/GenVertexNormalsProcess.cpp

@@ -192,7 +192,7 @@ bool GenVertexNormalsProcess::GenMeshVertexNormals (aiMesh* pMesh, unsigned int
                 const aiVector3D& v = pMesh->mNormals[verticesFound[a]];
                 const aiVector3D& v = pMesh->mNormals[verticesFound[a]];
                 if (is_not_qnan(v.x))pcNor += v;
                 if (is_not_qnan(v.x))pcNor += v;
             }
             }
-            pcNor.Normalize();
+            pcNor.NormalizeSafe();
 
 
             // Write the smoothed normal back to all affected normals
             // Write the smoothed normal back to all affected normals
             for (unsigned int a = 0; a < verticesFound.size(); ++a)
             for (unsigned int a = 0; a < verticesFound.size(); ++a)
@@ -225,7 +225,7 @@ bool GenVertexNormalsProcess::GenMeshVertexNormals (aiMesh* pMesh, unsigned int
                 if (v * vr >= fLimit * vrlen * v.Length())
                 if (v * vr >= fLimit * vrlen * v.Length())
                     pcNor += v;
                     pcNor += v;
             }
             }
-            pcNew[i] = pcNor.Normalize();
+            pcNew[i] = pcNor.NormalizeSafe();
         }
         }
     }
     }
 
 

+ 2 - 0
include/assimp/vector3.h

@@ -116,6 +116,8 @@ public:
     /** @brief Normalize the vector */
     /** @brief Normalize the vector */
     aiVector3t& Normalize();
     aiVector3t& Normalize();
 
 
+    /** @brief Normalize the vector with extra check for zero vectors */
+    aiVector3t& NormalizeSafe();
 
 
     /** @brief Componentwise multiplication of two vectors
     /** @brief Componentwise multiplication of two vectors
      *
      *

+ 8 - 0
include/assimp/vector3.inl

@@ -101,6 +101,14 @@ AI_FORCE_INLINE aiVector3t<TReal>& aiVector3t<TReal>::Normalize() {
 }
 }
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 template <typename TReal>
 template <typename TReal>
+AI_FORCE_INLINE aiVector3t<TReal>& aiVector3t<TReal>::NormalizeSafe() {
+    TReal len = Length();
+    if (len > static_cast<TReal>(0))
+        *this /= Length();
+    return *this;
+}
+// ------------------------------------------------------------------------------------------------
+template <typename TReal>
 AI_FORCE_INLINE const aiVector3t<TReal>& aiVector3t<TReal>::operator += (const aiVector3t<TReal>& o) {
 AI_FORCE_INLINE const aiVector3t<TReal>& aiVector3t<TReal>::operator += (const aiVector3t<TReal>& o) {
     x += o.x; y += o.y; z += o.z; return *this;
     x += o.x; y += o.y; z += o.z; return *this;
 }
 }