From b97308683b042d77f63a01138cf0167ba78a3137 Mon Sep 17 00:00:00 2001 From: yurik Date: Sat, 31 May 2025 03:05:44 -0400 Subject: [PATCH] Fix a bug in importing binary PLY file (#1) (#6060) * Correct IOStreamBuffer::getNextLine() to prevent skipping too many '\n', which could be part of the BINARY part * Add a regression test --- include/assimp/IOStreamBuffer.h | 5 ++++- .../models/PLY/cube_binary_starts_with_nl.ply | Bin 0 -> 451 bytes test/unit/utPLYImportExport.cpp | 21 ++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 test/models/PLY/cube_binary_starts_with_nl.ply diff --git a/include/assimp/IOStreamBuffer.h b/include/assimp/IOStreamBuffer.h index ca2db9c4d..29b7cf317 100644 --- a/include/assimp/IOStreamBuffer.h +++ b/include/assimp/IOStreamBuffer.h @@ -318,7 +318,10 @@ AI_FORCE_INLINE bool IOStreamBuffer::getNextLine(std::vector &buffer) { } } buffer[i] = '\n'; - while (m_cachePos < m_cacheSize && (m_cache[m_cachePos] == '\r' || m_cache[m_cachePos] == '\n')) { + if (m_cachePos < m_cacheSize && (m_cache[m_cachePos] == '\r')) { + ++m_cachePos; + } + if (m_cachePos < m_cacheSize && (m_cache[m_cachePos] == '\n')) { ++m_cachePos; } diff --git a/test/models/PLY/cube_binary_starts_with_nl.ply b/test/models/PLY/cube_binary_starts_with_nl.ply new file mode 100644 index 0000000000000000000000000000000000000000..0eed84a5c26eb916e4ac9b6908bf5b60d2f70476 GIT binary patch literal 451 zcmZ8cK~BRk5Ht`#@+ zP@0CG)15Z@)5iCIMyYay#o^rOHo#Y2DG!<+zPlpTw!lu($I=Q_fnLh(&#Tz4gWfE6 zdb1SbSPLPyzeoO2vxoKQAGHt>XP*(y2^WOun&^sf$;BRn;08M*CN9{;V-XVmMeshes[0]->mFaces[0].mIndices[2]); } +// Tests of a PLY file gets read with \n as the fist character in the BINARY part +TEST_F(utPLYImportExport, importBinaryPLYWithNewlineInBinary) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube_binary_starts_with_nl.ply", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene->mMeshes[0]); + ASSERT_EQ(8u, scene->mMeshes[0]->mNumVertices); + // Make sure the first binary float was read correctly + ASSERT_FLOAT_EQ(5.967534f, scene->mMeshes[0]->mVertices[0][0]); + ASSERT_FLOAT_EQ(0, scene->mMeshes[0]->mVertices[0][1]); + ASSERT_FLOAT_EQ(0, scene->mMeshes[0]->mVertices[0][2]); + + ASSERT_EQ(6u, scene->mMeshes[0]->mNumFaces); + // Also check if the indices were parsed correctly + ASSERT_EQ(4u, 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);