浏览代码

Merge branch 'master' into dev/gltf-KHR_materials

Kim Kulling 4 年之前
父节点
当前提交
48b138ce13
共有 3 个文件被更改,包括 29 次插入14 次删除
  1. 5 14
      include/assimp/IOStreamBuffer.h
  2. 4 0
      include/assimp/quaternion.h
  3. 20 0
      include/assimp/quaternion.inl

+ 5 - 14
include/assimp/IOStreamBuffer.h

@@ -254,25 +254,16 @@ bool IOStreamBuffer<T>::getNextDataLine( std::vector<T> &buffer, T continuationT
         }
         }
     }
     }
 
 
-    bool continuationFound( false );
     size_t i = 0;
     size_t i = 0;
     for( ;; ) {
     for( ;; ) {
-        if ( continuationToken == m_cache[ m_cachePos ] ) {
-            continuationFound = true;
+        if ( continuationToken == m_cache[ m_cachePos ] && IsLineEnd( m_cache[ m_cachePos + 1 ] ) ) {
             ++m_cachePos;
             ++m_cachePos;
-        }
-        if ( IsLineEnd( m_cache[ m_cachePos ] ) ) {
-            if ( !continuationFound ) {
-                // the end of the data line
-                break;
-            } else {
-                // skip line end
-                while ( m_cache[m_cachePos] != '\n') {
-                    ++m_cachePos;
-                }
+            while ( m_cache[ m_cachePos ] != '\n' ) {
                 ++m_cachePos;
                 ++m_cachePos;
-                continuationFound = false;
             }
             }
+            ++m_cachePos;
+        } else if ( IsLineEnd ( m_cache[ m_cachePos ] ) ) {
+            break;
         }
         }
 
 
         buffer[ i ] = m_cache[ m_cachePos ];
         buffer[ i ] = m_cache[ m_cachePos ];

+ 4 - 0
include/assimp/quaternion.h

@@ -57,6 +57,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 template <typename TReal> class aiVector3t;
 template <typename TReal> class aiVector3t;
 template <typename TReal> class aiMatrix3x3t;
 template <typename TReal> class aiMatrix3x3t;
+template <typename TReal> class aiMatrix4x4t;
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Represents a quaternion in a 4D vector. */
 /** Represents a quaternion in a 4D vector. */
@@ -88,6 +89,9 @@ public:
     bool operator== (const aiQuaterniont& o) const;
     bool operator== (const aiQuaterniont& o) const;
     bool operator!= (const aiQuaterniont& o) const;
     bool operator!= (const aiQuaterniont& o) const;
 
 
+    // transform vector by matrix
+    aiQuaterniont& operator *= (const aiMatrix4x4t<TReal>& mat);
+
     bool Equal(const aiQuaterniont& o, TReal epsilon = 1e-6) const;
     bool Equal(const aiQuaterniont& o, TReal epsilon = 1e-6) const;
 
 
 public:
 public:

+ 20 - 0
include/assimp/quaternion.inl

@@ -57,6 +57,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 #include <cmath>
 #include <cmath>
 
 
+// ------------------------------------------------------------------------------------------------
+/** Transformation of a quaternion by a 4x4 matrix */
+template <typename TReal>
+AI_FORCE_INLINE
+aiQuaterniont<TReal> operator * (const aiMatrix4x4t<TReal>& pMatrix, const aiQuaterniont<TReal>& pQuaternion) {
+    aiQuaterniont<TReal> res;
+    res.x = pMatrix.a1 * pQuaternion.x + pMatrix.a2 * pQuaternion.y + pMatrix.a3 * pQuaternion.z + pMatrix.a4 * pQuaternion.w;
+    res.y = pMatrix.b1 * pQuaternion.x + pMatrix.b2 * pQuaternion.y + pMatrix.b3 * pQuaternion.z + pMatrix.b4 * pQuaternion.w;
+    res.z = pMatrix.c1 * pQuaternion.x + pMatrix.c2 * pQuaternion.y + pMatrix.c3 * pQuaternion.z + pMatrix.c4 * pQuaternion.w;
+    res.w = pMatrix.d1 * pQuaternion.x + pMatrix.d2 * pQuaternion.y + pMatrix.d3 * pQuaternion.z + pMatrix.d4 * pQuaternion.w;
+    return res;
+}
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 template<typename TReal>
 template<typename TReal>
 bool aiQuaterniont<TReal>::operator== (const aiQuaterniont& o) const
 bool aiQuaterniont<TReal>::operator== (const aiQuaterniont& o) const
@@ -71,6 +83,14 @@ bool aiQuaterniont<TReal>::operator!= (const aiQuaterniont& o) const
     return !(*this == o);
     return !(*this == o);
 }
 }
 
 
+// ------------------------------------------------------------------------------------------------
+template <typename TReal>
+AI_FORCE_INLINE
+aiQuaterniont<TReal>& aiQuaterniont<TReal>::operator *= (const aiMatrix4x4t<TReal>& mat){
+    return (*this = mat * (*this));
+}
+// ------------------------------------------------------------------------------------------------
+
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 template<typename TReal>
 template<typename TReal>
 inline bool aiQuaterniont<TReal>::Equal(const aiQuaterniont& o, TReal epsilon) const {
 inline bool aiQuaterniont<TReal>::Equal(const aiQuaterniont& o, TReal epsilon) const {