瀏覽代碼

Merge branch 'master' into fix-artifact

Kazuki Y 2 年之前
父節點
當前提交
d04dd1af9b

+ 1 - 0
code/AssetLib/FBX/FBXCommon.h

@@ -55,6 +55,7 @@ const char NULL_RECORD[NumNullRecords] = { // 25 null bytes in 64-bit and 13 nul
     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
 }; // who knows why, it looks like two integers 32/64 bit (compressed and uncompressed sizes?) + 1 byte (might be compression type?)
 }; // who knows why, it looks like two integers 32/64 bit (compressed and uncompressed sizes?) + 1 byte (might be compression type?)
+static std::string NULL_RECORD_STRING(NumNullRecords, '\0');
 const std::string SEPARATOR = { '\x00', '\x01' }; // for use inside strings
 const std::string SEPARATOR = { '\x00', '\x01' }; // for use inside strings
 const std::string MAGIC_NODE_TAG = "_$AssimpFbx$"; // from import
 const std::string MAGIC_NODE_TAG = "_$AssimpFbx$"; // from import
 const int64_t SECOND = 46186158000; // FBX's kTime unit
 const int64_t SECOND = 46186158000; // FBX's kTime unit

+ 1 - 1
code/AssetLib/FBX/FBXExportNode.cpp

@@ -360,7 +360,7 @@ void FBX::Node::EndBinary(
     bool has_children
     bool has_children
 ) {
 ) {
     // if there were children, add a null record
     // if there were children, add a null record
-    if (has_children) { s.PutString(Assimp::FBX::NULL_RECORD); }
+    if (has_children) { s.PutString(Assimp::FBX::NULL_RECORD_STRING); }
 
 
     // now go back and write initial pos
     // now go back and write initial pos
     this->end_pos = s.Tell();
     this->end_pos = s.Tell();

+ 9 - 7
code/AssetLib/MD5/MD5Parser.cpp

@@ -5,8 +5,6 @@ Open Asset Import Library (assimp)
 
 
 Copyright (c) 2006-2022, assimp team
 Copyright (c) 2006-2022, assimp team
 
 
-
-
 All rights reserved.
 All rights reserved.
 
 
 Redistribution and use of this software in source and binary forms,
 Redistribution and use of this software in source and binary forms,
@@ -117,6 +115,9 @@ void MD5Parser::ParseHeader() {
         ReportError("MD5 version tag is unknown (10 is expected)");
         ReportError("MD5 version tag is unknown (10 is expected)");
     }
     }
     SkipLine();
     SkipLine();
+    if (buffer == bufferEnd) {
+        return;
+    }
 
 
     // print the command line options to the console
     // print the command line options to the console
     // FIX: can break the log length limit, so we need to be careful
     // FIX: can break the log length limit, so we need to be careful
@@ -135,8 +136,9 @@ bool MD5Parser::ParseSection(Section &out) {
 
 
     // first parse the name of the section
     // first parse the name of the section
     char *sz = buffer;
     char *sz = buffer;
-    while (!IsSpaceOrNewLine(*buffer))
-        buffer++;
+    while (!IsSpaceOrNewLine(*buffer)) {
+        ++buffer;
+    }
     out.mName = std::string(sz, (uintptr_t)(buffer - sz));
     out.mName = std::string(sz, (uintptr_t)(buffer - sz));
     SkipSpaces();
     SkipSpaces();
 
 
@@ -144,14 +146,14 @@ bool MD5Parser::ParseSection(Section &out) {
     while (running) {
     while (running) {
         if ('{' == *buffer) {
         if ('{' == *buffer) {
             // it is a normal section so read all lines
             // it is a normal section so read all lines
-            buffer++;
+            ++buffer;
             bool run = true;
             bool run = true;
             while (run) {
             while (run) {
                 if (!SkipSpacesAndLineEnd()) {
                 if (!SkipSpacesAndLineEnd()) {
                     return false; // seems this was the last section
                     return false; // seems this was the last section
                 }
                 }
                 if ('}' == *buffer) {
                 if ('}' == *buffer) {
-                    buffer++;
+                    ++buffer;
                     break;
                     break;
                 }
                 }
 
 
@@ -163,7 +165,7 @@ bool MD5Parser::ParseSection(Section &out) {
 
 
                 // terminate the line with zero
                 // terminate the line with zero
                 while (!IsLineEnd(*buffer))
                 while (!IsLineEnd(*buffer))
-                    buffer++;
+                    ++buffer;
                 if (*buffer) {
                 if (*buffer) {
                     ++lineNumber;
                     ++lineNumber;
                     *buffer++ = '\0';
                     *buffer++ = '\0';

+ 4 - 3
code/AssetLib/OFF/OFFLoader.cpp

@@ -290,11 +290,12 @@ void OFFImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS
         sz = line; SkipSpaces(&sz);
         sz = line; SkipSpaces(&sz);
         idx = strtoul10(sz,&sz);
         idx = strtoul10(sz,&sz);
         if(!idx || idx > 9) {
         if(!idx || idx > 9) {
-	    ASSIMP_LOG_ERROR("OFF: Faces with zero indices aren't allowed");
+	        ASSIMP_LOG_ERROR("OFF: Faces with zero indices aren't allowed");
             --mesh->mNumFaces;
             --mesh->mNumFaces;
+            ++i;
             continue;
             continue;
-	}
-	faces->mNumIndices = idx;
+	    }
+	    faces->mNumIndices = idx;
         faces->mIndices = new unsigned int[faces->mNumIndices];
         faces->mIndices = new unsigned int[faces->mNumIndices];
         for (unsigned int m = 0; m < faces->mNumIndices;++m) {
         for (unsigned int m = 0; m < faces->mNumIndices;++m) {
             SkipSpaces(&sz);
             SkipSpaces(&sz);

+ 1 - 1
code/AssetLib/Obj/ObjFileParser.cpp

@@ -440,7 +440,7 @@ void ObjFileParser::getFace(aiPrimitiveType type) {
     const bool vt = (!m_pModel->mTextureCoord.empty());
     const bool vt = (!m_pModel->mTextureCoord.empty());
     const bool vn = (!m_pModel->mNormals.empty());
     const bool vn = (!m_pModel->mNormals.empty());
     int iPos = 0;
     int iPos = 0;
-    while (m_DataIt != m_DataItEnd) {
+    while (m_DataIt < m_DataItEnd) {
         int iStep = 1;
         int iStep = 1;
 
 
         if (IsLineEnd(*m_DataIt)) {
         if (IsLineEnd(*m_DataIt)) {

+ 6 - 2
code/AssetLib/Obj/ObjTools.h

@@ -2,7 +2,7 @@
 Open Asset Import Library (assimp)
 Open Asset Import Library (assimp)
 ----------------------------------------------------------------------
 ----------------------------------------------------------------------
 
 
-Copyright (c) 2006-2021, assimp team
+Copyright (c) 2006-2022, assimp team
 
 
 All rights reserved.
 All rights reserved.
 
 
@@ -111,6 +111,10 @@ inline Char_T getNextToken(Char_T pBuffer, Char_T pEnd) {
  */
  */
 template <class char_t>
 template <class char_t>
 inline char_t skipLine(char_t it, char_t end, unsigned int &uiLine) {
 inline char_t skipLine(char_t it, char_t end, unsigned int &uiLine) {
+    if (it >= end) {
+        return it;
+    }
+
     while (!isEndOfBuffer(it, end) && !IsLineEnd(*it)) {
     while (!isEndOfBuffer(it, end) && !IsLineEnd(*it)) {
         ++it;
         ++it;
     }
     }
@@ -129,7 +133,7 @@ inline char_t skipLine(char_t it, char_t end, unsigned int &uiLine) {
 
 
 /** 
 /** 
  *  @brief  Get a name from the current line. Preserve space in the middle,
  *  @brief  Get a name from the current line. Preserve space in the middle,
- *    but trim it at the end.
+ *          but trim it at the end.
  *  @param[in]  it      set to current position
  *  @param[in]  it      set to current position
  *  @param[in]  end     set to end of scratch buffer for readout
  *  @param[in]  end     set to end of scratch buffer for readout
  *  @param[out] name    Separated name
  *  @param[out] name    Separated name

+ 5 - 2
include/assimp/material.inl

@@ -97,9 +97,12 @@ AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
         if (prop->mType != aiPTI_Buffer) {
         if (prop->mType != aiPTI_Buffer) {
             return AI_FAILURE;
             return AI_FAILURE;
         }
         }
-
+// std::min has in some cases a conflict with a defined min
+#ifdef min
+#   undef min
+#endif 
         iNum = static_cast<unsigned int>(std::min(static_cast<size_t>(iNum),prop->mDataLength / sizeof(Type)));
         iNum = static_cast<unsigned int>(std::min(static_cast<size_t>(iNum),prop->mDataLength / sizeof(Type)));
-        ::memcpy(pOut,prop->mData,iNum * sizeof(Type));
+        std::memcpy(pOut,prop->mData,iNum * sizeof(Type));
         if (pMax) {
         if (pMax) {
             *pMax = iNum;
             *pMax = iNum;
         }
         }