From f5533656f1ffe3bd468699d03fd7e09b3c94cd73 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Fri, 22 Oct 2021 12:06:38 +0200 Subject: [PATCH] fix save crash on e57, setting min and max quality on scanheader --- src/meshlabplugins/io_e57/io_e57.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/meshlabplugins/io_e57/io_e57.cpp b/src/meshlabplugins/io_e57/io_e57.cpp index 494e775a5..0e5ab7b3f 100755 --- a/src/meshlabplugins/io_e57/io_e57.cpp +++ b/src/meshlabplugins/io_e57/io_e57.cpp @@ -284,7 +284,7 @@ void E57IOPlugin::save(const QString& formatName, const QString& fileName, MeshM scanHeader.pose.rotation = quaternion; - scanHeader.pointFields.cartesianInvalidStateField = true; + scanHeader.pointFields.cartesianInvalidStateField = false; scanHeader.pointFields.cartesianXField = true; scanHeader.pointFields.cartesianYField = true; scanHeader.pointFields.cartesianZField = true; @@ -295,6 +295,7 @@ void E57IOPlugin::save(const QString& formatName, const QString& fileName, MeshM scanHeader.pointFields.normalZ = true; } if ((mask & Mask::IOM_VERTCOLOR) != 0) { + scanHeader.pointFields.isColorInvalidField = false; scanHeader.pointFields.colorRedField = true; scanHeader.pointFields.colorGreenField = true; scanHeader.pointFields.colorBlueField = true; @@ -306,6 +307,16 @@ void E57IOPlugin::save(const QString& formatName, const QString& fileName, MeshM scanHeader.colorLimits.colorBlueMaximum = e57::E57_UINT8_MAX; } if ((mask & Mask::IOM_VERTQUALITY) != 0) { + float min = std::numeric_limits::max(); + float max = std::numeric_limits::min(); + for (size_t i = 0; i < m.cm.vert.size(); ++i) { + if (m.cm.vert[i].Q() < min) + min = m.cm.vert[i].Q(); + if (m.cm.vert[i].Q() > max) + max = m.cm.vert[i].Q(); + } + scanHeader.intensityLimits.intensityMinimum = min; + scanHeader.intensityLimits.intensityMaximum = max; scanHeader.pointFields.intensityField = true; } @@ -326,14 +337,10 @@ void E57IOPlugin::save(const QString& formatName, const QString& fileName, MeshM pointsData.cartesianY[i] = vertices[i].P().Y(); pointsData.cartesianZ[i] = vertices[i].P().Z(); - pointsData.cartesianInvalidState[i] = 0; - if (data3DPoints.areColorsAvailable()) { pointsData.colorRed[i] = static_cast(vertices[i].C().X()); pointsData.colorGreen[i] = static_cast(vertices[i].C().Y()); pointsData.colorBlue[i] = static_cast(vertices[i].C().Z()); - if (scanHeader.pointFields.isColorInvalidField) - pointsData.isColorInvalid[i] = 0; } if (data3DPoints.areNormalsAvailable()) { @@ -344,7 +351,6 @@ void E57IOPlugin::save(const QString& formatName, const QString& fileName, MeshM if (data3DPoints.isQualityAvailable()) { pointsData.intensity[i] = vertices[i].Q(); - pointsData.isIntensityInvalid[i] = 0; } }