From c15050b4557ba7696540fdc2c98e56f6ddee7b8a Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Thu, 15 Jul 2021 16:57:58 +0200 Subject: [PATCH] add support for RAE coordinates --- src/meshlabplugins/io_e57/io_e57.cpp | 75 +++++++++------- src/meshlabplugins/io_e57/io_e57.h | 128 +++++++++++++++++---------- 2 files changed, 121 insertions(+), 82 deletions(-) diff --git a/src/meshlabplugins/io_e57/io_e57.cpp b/src/meshlabplugins/io_e57/io_e57.cpp index f90728149..59faf7b00 100755 --- a/src/meshlabplugins/io_e57/io_e57.cpp +++ b/src/meshlabplugins/io_e57/io_e57.cpp @@ -208,7 +208,7 @@ std::pair E57IOPlugin::extractMeshImage(const e57::Reader return std::pair{imageHeader, QImage{}}; } - // Get sizes speces for the image + // Get sizes specs for the image fileReader.GetImage2DSizes(scanIndex, imageProjection, imageType, width, height, size, imageMaskType, imageVisualType); @@ -311,7 +311,6 @@ void E57IOPlugin::save(const QString& formatName, const QString& fileName, MeshM scanIndex = fileWriter.NewData3D(scanHeader); - vcg::tri::io::E57Data3DPoints data3DPoints{totalPoints, scanHeader}; e57::Data3DPointsData& pointsData = data3DPoints.points(); @@ -413,9 +412,6 @@ void E57IOPlugin::loadMesh(MeshModel &m, int &mask, int scanIndex, size_t buffSi // object holding data read from E57 file vcg::tri::io::E57Data3DPoints data3DPoints{buffSize, scanHeader}; - if (!data3DPoints.areCoordinatesAvailable()) { - return; - } size_t size = 0; auto dataReader = fileReader.SetUpData3DPointsData(scanIndex, buffSize, data3DPoints.points()); @@ -444,38 +440,49 @@ void E57IOPlugin::loadMesh(MeshModel &m, int &mask, int scanIndex, size_t buffSi Point3m coordinates; - if (pointsData.cartesianInvalidState == nullptr || pointsData.cartesianInvalidState[i] == 0) { + if (data3DPoints.areCoordinatesAvailable()) { - coordinates[0] = pointsData.cartesianX[i]; - coordinates[1] = pointsData.cartesianY[i]; - coordinates[2] = pointsData.cartesianZ[i]; - - auto vertex = vcg::tri::Allocator::AddVertex(m.cm, coordinates); - - // Set the normals. - if (data3DPoints.areNormalsAvailable()) { - vertex->N()[0] = pointsData.normalX[i]; - vertex->N()[1] = pointsData.normalY[i]; - vertex->N()[2] = pointsData.normalZ[i]; + if (pointsData.cartesianInvalidState == nullptr || pointsData.cartesianInvalidState[i] == 0) { + coordinates[0] = pointsData.cartesianX[i]; + coordinates[1] = pointsData.cartesianY[i]; + coordinates[2] = pointsData.cartesianZ[i]; } - - // Set the quality. - if (data3DPoints.isQualityAvailable()) { - vertex->Q() = pointsData.intensity[i]; - } - - // Set the point color. - if (data3DPoints.areColorsAvailable()) { - vertex->C()[0] = pointsData.colorRed[i]; - vertex->C()[1] = pointsData.colorGreen[i]; - vertex->C()[2] = pointsData.colorBlue[i]; - vertex->C()[3] = 0xFF; - } - else { - // TODO: extract colors from the image? - } - } + else if (data3DPoints.areSphericalCoordinatesAvailable()) { + + if (pointsData.sphericalInvalidState == nullptr || pointsData.sphericalInvalidState[i] == 0) { + coordinates.FromPolarRad(pointsData.sphericalRange[i], pointsData.sphericalAzimuth[i], pointsData.sphericalElevation[i]); + } + } + else { + continue; + } + + auto vertex = vcg::tri::Allocator::AddVertex(m.cm, coordinates); + + // Set the normals. + if (data3DPoints.areNormalsAvailable()) { + vertex->N()[0] = pointsData.normalX[i]; + vertex->N()[1] = pointsData.normalY[i]; + vertex->N()[2] = pointsData.normalZ[i]; + } + + // Set the quality. + if (data3DPoints.isQualityAvailable()) { + vertex->Q() = pointsData.intensity[i]; + } + + // Set the point color. + if (data3DPoints.areColorsAvailable()) { + vertex->C()[0] = pointsData.colorRed[i]; + vertex->C()[1] = pointsData.colorGreen[i]; + vertex->C()[2] = pointsData.colorBlue[i]; + vertex->C()[3] = 0xFF; + } + else { + // TODO: extract colors from the image? + } + } } diff --git a/src/meshlabplugins/io_e57/io_e57.h b/src/meshlabplugins/io_e57/io_e57.h index 9f0c81f89..bf2d7f594 100755 --- a/src/meshlabplugins/io_e57/io_e57.h +++ b/src/meshlabplugins/io_e57/io_e57.h @@ -43,7 +43,34 @@ namespace vcg { class E57Data3DPoints { private: - e57::Data3DPointsData data3DPointsData{}; + e57::Data3DPointsData_t data3DPointsData{}; + + // XYZ Coordinates + std::vector cartesianX; + std::vector cartesianY; + std::vector cartesianZ; + std::vector cartesianInvalidState; + + // RAE Coordinates + std::vector sphericalRange; + std::vector sphericalElevation; + std::vector sphericalAzimuth; + std::vector sphericalInvalidState; + + // Intensity + std::vector intensity; /* Quality */ + std::vector intensityInvalid; + + // Colors + std::vector colorRed; + std::vector colorGreen; + std::vector colorBlue; + std::vector colorInvalid; + + // Normals + std::vector normalX; + std::vector normalY; + std::vector normalZ; public: @@ -51,80 +78,85 @@ namespace vcg { explicit E57Data3DPoints(size_t buffSize, e57::Data3D& scanHeader) { - data3DPointsData.rowIndex = new int32_t [buffSize]; - data3DPointsData.columnIndex = new int32_t [buffSize]; - if (scanHeader.pointFields.cartesianXField && scanHeader.pointFields.cartesianYField && scanHeader.pointFields.cartesianZField) { // XYZ coordinates - data3DPointsData.cartesianX = new float [buffSize]; - data3DPointsData.cartesianY = new float [buffSize]; - data3DPointsData.cartesianZ = new float [buffSize]; + cartesianX.resize(buffSize); cartesianY.resize(buffSize); cartesianZ.resize(buffSize); + + data3DPointsData.cartesianX = cartesianX.data(); + data3DPointsData.cartesianY = cartesianY.data(); + data3DPointsData.cartesianZ = cartesianZ.data(); + if (scanHeader.pointFields.cartesianInvalidStateField) { - data3DPointsData.cartesianInvalidState = new int8_t [buffSize]; + cartesianInvalidState.resize(buffSize); + data3DPointsData.cartesianInvalidState = cartesianInvalidState.data(); + } + } + + if (scanHeader.pointFields.sphericalAzimuthField && scanHeader.pointFields.sphericalElevationField && + scanHeader.pointFields.sphericalRangeField) { + + // + sphericalRange.resize(buffSize); sphericalElevation.resize(buffSize); sphericalAzimuth.resize(buffSize); + + data3DPointsData.sphericalRange = sphericalRange.data(); + data3DPointsData.sphericalAzimuth = sphericalAzimuth.data(); + data3DPointsData.sphericalElevation = sphericalElevation.data(); + + if (scanHeader.pointFields.sphericalInvalidStateField) { + sphericalInvalidState.resize(buffSize); + data3DPointsData.sphericalInvalidState = sphericalInvalidState.data(); } } if (scanHeader.pointFields.intensityField) { - data3DPointsData.intensity = new float [buffSize]; - data3DPointsData.isIntensityInvalid = new int8_t [buffSize]; + + intensity.resize(buffSize); + data3DPointsData.intensity = intensity.data(); + + if (scanHeader.pointFields.isIntensityInvalidField) { + intensityInvalid.resize(buffSize); + data3DPointsData.isIntensityInvalid = intensityInvalid.data(); + } } if (scanHeader.pointFields.colorRedField && scanHeader.pointFields.colorGreenField && scanHeader.pointFields.colorBlueField) { - data3DPointsData.colorRed = new uint8_t [buffSize]; - data3DPointsData.colorGreen = new uint8_t [buffSize]; - data3DPointsData.colorBlue = new uint8_t [buffSize]; - data3DPointsData.isColorInvalid = new int8_t [buffSize]; + colorRed.resize(buffSize); colorGreen.resize(buffSize); colorBlue.resize(buffSize); + + data3DPointsData.colorRed = colorRed.data(); + data3DPointsData.colorGreen = colorGreen.data(); + data3DPointsData.colorBlue = colorBlue.data(); + + if (scanHeader.pointFields.isColorInvalidField) { + colorInvalid.resize(buffSize); + data3DPointsData.isColorInvalid = colorInvalid.data(); + } } if (scanHeader.pointFields.normalX && scanHeader.pointFields.normalY && scanHeader.pointFields.normalZ) { - data3DPointsData.normalX = new float[buffSize]; - data3DPointsData.normalY = new float[buffSize]; - data3DPointsData.normalZ = new float[buffSize]; + normalX.resize(buffSize); normalY.resize(buffSize); normalZ.resize(buffSize); + + data3DPointsData.normalX = normalX.data(); + data3DPointsData.normalY = normalY.data(); + data3DPointsData.normalZ = normalZ.data(); } } - ~E57Data3DPoints() { - - delete[] data3DPointsData.rowIndex; - delete[] data3DPointsData.columnIndex; - - if (areCoordinatesAvailable()) { - - delete[] this->data3DPointsData.cartesianX; - delete[] this->data3DPointsData.cartesianY; - delete[] this->data3DPointsData.cartesianZ; - delete[] this->data3DPointsData.cartesianInvalidState; - } - - if (isQualityAvailable()) { - delete[] this->data3DPointsData.intensity; - delete[] this->data3DPointsData.isIntensityInvalid; - } - - if (areNormalsAvailable()) { - delete[] this->data3DPointsData.normalX; - delete[] this->data3DPointsData.normalY; - delete[] this->data3DPointsData.normalZ; - } - - if (areColorsAvailable()) { - delete[] this->data3DPointsData.colorRed; - delete[] this->data3DPointsData.colorGreen; - delete[] this->data3DPointsData.colorBlue; - delete[] this->data3DPointsData.isColorInvalid; - } - } + ~E57Data3DPoints() {} inline bool areCoordinatesAvailable() const { return this->data3DPointsData.cartesianX || this->data3DPointsData.cartesianY || this->data3DPointsData.cartesianZ; } + inline bool areSphericalCoordinatesAvailable() const { + return this->data3DPointsData.sphericalRange || this->data3DPointsData.sphericalAzimuth || this->data3DPointsData.sphericalElevation; + } + inline bool areColorsAvailable() const { return this->data3DPointsData.colorRed || this->data3DPointsData.colorGreen || this->data3DPointsData.colorBlue; }