diff --git a/code/AssetLib/Ply/PlyParser.cpp b/code/AssetLib/Ply/PlyParser.cpp index a7cf92606..6edba71fc 100644 --- a/code/AssetLib/Ply/PlyParser.cpp +++ b/code/AssetLib/Ply/PlyParser.cpp @@ -420,7 +420,7 @@ bool PLY::DOM::ParseHeader(IOStreamBuffer &streamBuffer, std::vector if (PLY::Element::ParseElement(streamBuffer, buffer, &out)) { // add the element to the list of elements alElements.push_back(out); - } else if (TokenMatch(buffer, "end_header", 10)) { //checks for /n ending, if it doesn't end with /r/n + } else if (TokenMatch(buffer, "end_header", 10)) { // we have reached the end of the header break; } else { diff --git a/include/assimp/IOStreamBuffer.h b/include/assimp/IOStreamBuffer.h index b34fc9ee1..fae480e71 100644 --- a/include/assimp/IOStreamBuffer.h +++ b/include/assimp/IOStreamBuffer.h @@ -323,7 +323,9 @@ AI_FORCE_INLINE bool IOStreamBuffer::getNextLine(std::vector &buffer) { } } buffer[i] = '\n'; - ++m_cachePos; + while (m_cachePos < m_cacheSize && (m_cache[m_cachePos] == '\r' || m_cache[m_cachePos] == '\n')) { + ++m_cachePos; + } return true; } diff --git a/test/models/PLY/cube_binary_header_with_RN_newline.ply b/test/models/PLY/cube_binary_header_with_RN_newline.ply new file mode 100644 index 000000000..bff347860 Binary files /dev/null and b/test/models/PLY/cube_binary_header_with_RN_newline.ply differ diff --git a/test/unit/utPLYImportExport.cpp b/test/unit/utPLYImportExport.cpp index 2edbdd71f..1f733c0e7 100644 --- a/test/unit/utPLYImportExport.cpp +++ b/test/unit/utPLYImportExport.cpp @@ -125,6 +125,22 @@ TEST_F(utPLYImportExport, importBinaryPLY) { EXPECT_EQ(12u, scene->mMeshes[0]->mNumFaces); } +// Tests of a PLY file gets read with \r\n as newlines instead of just \n (i.e. solidwork exported ply files) +TEST_F(utPLYImportExport, importBinaryPLYWithRNNewline) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube_binary_header_with_RN_newline.ply", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene->mMeshes[0]); + // This test model is double sided, so 12 faces instead of 6 + ASSERT_EQ(12u, scene->mMeshes[0]->mNumFaces); + // Also check if the indices were parsed correctly + ASSERT_EQ(3u, scene->mMeshes[0]->mFaces[0].mNumIndices); + EXPECT_EQ(0u, scene->mMeshes[0]->mFaces[0].mIndices[0]); + EXPECT_EQ(1u, scene->mMeshes[0]->mFaces[0].mIndices[1]); + EXPECT_EQ(2u, scene->mMeshes[0]->mFaces[0].mIndices[2]); +} + TEST_F(utPLYImportExport, vertexColorTest) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/float-color.ply", aiProcess_ValidateDataStructure);